簡體   English   中英

如何從 Json 字符串中刪除反斜杠

[英]How do I remove backslashes from Json string

我正在嘗試使用以下代碼構建動態 JSON 請求消息。 嘗試通過反序列化 JSON 字符串來刪除轉義字符時,我收到異常。 具體消息請看下方評論。 如何刪除轉義字符? 有沒有更好的方法來生成請求消息? 數據是正確的,只是需要修正JSON格式。

這是我添加到測試結果消息 class 中的測試結果 JSON 密鑰對值,我將其序列化以獲取發送到 API 的請求消息:

{[
  "{\"TestResultSequenceID\":\"1\",\"ActionInfoID\":\"4\",\"Description\":\"Motor 1 amparage draw:\",\"TimeStamp\":\"10/6/2021\",\"AmpDraw\":\"3.4 Amperage\"}",
  "{\"TestResultSequenceID\":\"2\",\"ActionInfoID\":\"5\",\"Description\":\"Motor 2 amparage draw:\",\"TimeStamp\":\"10/6/2021\",\"AmpDraw\":\"3.4 Amperage\"}",
  "{\"TestResultSequenceID\":\"3\",\"ActionInfoID\":\"6\",\"Description\":\"Fuel pump sock pressed onto assembly:\",\"TimeStamp\":\"10/6/2021\",\"PressedOnFlag\":\" True\"}",
  "{\"TestResultSequenceID\":\"4\",\"ActionInfoID\":\"7\",\"Description\":\"Component pump 1 serial barcode label:\",\"TimeStamp\":\"10/6/2021\",\"ComponentPump1SerialNumber\":\"20210930000001\"}",
  "{\"TestResultSequenceID\":\"5\",\"ActionInfoID\":\"8\",\"Description\":\"Component pump 2 serial barcode label:\",\"TimeStamp\":\"10/6/2021\",\"ComponentPump2SerialNumber\":\"20210930000002\"}",
  "{\"TestResultSequenceID\":\"6\",\"ActionInfoID\":\"9\",\"Description\":\"Fuel pump assembly serial number:\",\"TimeStamp\":\"10/6/2021\",\"AssemblySerialNumber\":\"20210930000003\"}"
]}

下面是將測試結果加載到 JArray 的代碼:

注意:此時正在添加轉義字符。

JArray testresultsjarray = new JArray();
JObject testresultsobj = new JObject();
//Loop through the test action log to build the test results dynamic json object
//var testactionlog = TestActionInfoLogCS.TestActionInfoLogGLRepository;
            
for (int i = 0; i < TestActionInfoLogCS.TestActionInfoLogGLRepository.Count - 1; i++)
{
   dynamic testresultobj = new JObject();
   //Code removed that get the attribute info and loads it to the AttributeInfoDT                                   
   if ((bool)TestActionInfoLogCS.TestActionInfoLogGLRepository[i].IsTestFlag)
   {
   //Attribute Driven Test Results Code
   //Use the attribute to set the attribute name as the key value when building the test results
   objtestresult = GetDynamicObject(new Dictionary<string, object>()
   {
     {
       AttributeInfoDT.Rows[0]["Attribute"].ToString(), //Attribute = AmpDraw
       TestActionInfoLogCS.TestActionInfoLogGLRepository[i].ScannedInValue 
       //ScannedInValue = 3.4 Amperage
      }
    });
    string testresultstring1 = JsonConvert.SerializeObject(objtestresult);
    //testresultstring1 = "{\"AmpDraw\":\"3.4 Amperage\"}"
    //var testresult1 = JsonConvert.DeserializeObject<string>(testresultstring1);
                                                        
    //JsonConvert.DeserializeObject throughs the following exception:
    //Unexpected character encountered while parsing value: {. Path '', line 1, position 1.
                                                       
    testresultobj.TestResultSequenceID = TestActionInfoLogCS.TestActionInfoLogGLRepository[i].TestResultSequenceID.ToString();
    testresultobj.ActionInfoID = TestActionInfoLogCS.TestActionInfoLogGLRepository[i].TestActionSequenceNumber.ToString();
    testresultobj.Description = TestActionInfoLogCS.TestActionInfoLogGLRepository[i].TestActionDescription;                  
    testresultobj.TimeStamp = Convert.ToDateTime(TestActionInfoLogCS.TestActionInfoLogGLRepository[i].AddedDateTime).ToString("d");
    string testresultstring2 = JsonConvert.SerializeObject(testresultobj, Formatting.None);
    //testresultstring2 = "{\"TestResultSequenceID\":\"1\",\"ActionInfoID\":\"4\",\"Description\":\"Motor 1 amparage draw:\",\"TimeStamp\":\"10/6/2021\"}"
    //var testresult2 = JsonConvert.DeserializeObject<string>(testresultstring2);
    //Unexpected character encountered while parsing value: {. Path '', line 1, position 1.
                
    string combindedtestresults = testresultstring2.Substring(0, testresultstring2.Length - 1) + "," + testresultstring1.Substring(1, testresultstring1.Length - 1);
            
    //var combindedtestresults = JsonConvert.DeserializeObject<string>(combindedtestresult);
                                                        
    testresultsjarray.Add(combindedtestresults);
  }
}

我調用負載測試結果請求消息存儲庫方法:

TestResultRequestMessageInfoCS.LoadTestResultRequestMessageInfoGLRepository(testresultsjarray))                                   

這是加載方法:

public static bool LoadTestResultRequestMessageInfoGLRepository(object TestResults)
{
    TestResultRequestMessageInfoGLRepository.Add(new TestResultRequestMessageInfoCS
    {
        TransactionID = TestInfoLogCS.TestInfoLogGLRepository[0].TransactionID.ToString(),
        SerialNumber = TestActionInfoLogCS.TestActionInfoLogGLRepository[0].ScannedInValue.ToString(),
        TestInfoLogID = TestInfoLogCS.TestInfoLogGLRepository[0].TestInfoLogID.ToString(),
        TestInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].TestInfoID.ToString(),
        BusinessUnitOverhead = TestInfoLogCS.TestInfoLogGLRepository[0].BusinessUnitOverhead.ToString(),             
        PID = TestInfoLogCS.TestInfoLogGLRepository[0].PID.ToString(),                        
        TestDescription = TestInfoLogCS.TestInfoLogGLRepository[0].TestDescription.ToString(),
        ProtocolInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].ProtocolInfoID.ToString(),
        DeviceInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].DeviceInfoID.ToString(),
        DeviceIPAddress = DeviceInfoCS.DeviceInfoGLRepository[0].DeviceIPAddress.ToString(),
        DevicePort = DeviceInfoCS.DeviceInfoGLRepository[0].DevicePort.ToString(),
        ProcessTestResultsServiceInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].ProcessTestResultsServiceInfoID.ToString(),
        ProcessTestResultsServiceIPAddress = ProcessTestResultsServiceInfoCS.ProcessTestResultsServiceInfoRepository[0].ServiceIPAddress.ToString(),
        ProcessTestResultsServicePort = ProcessTestResultsServiceInfoCS.ProcessTestResultsServiceInfoRepository[0].ServicePort.ToString(),
        StartTesterServiceInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].StartTesterServiceInfoID.ToString(),
        StartTesterServiceIPAddress = StartTesterServiceInfoCS.StartTesterServiceInfoRepository[0].ServiceIPAddress.ToString(),
        StartTesterServicePort = StartTesterServiceInfoCS.StartTesterServiceInfoRepository[0].ServicePort.ToString(),
        ClientTesterInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].ClientTesterInfoID.ToString(),
        ClientTesterIPAddress = ClientTesterInfoCS.ClientTesterInfoGLRepository[0].ClientTesterIPAddress.ToString(),
        ClientTesterPort = ClientTesterInfoCS.ClientTesterInfoGLRepository[0].ClientTesterPort.ToString(),
        TestRequestListenerMiddlewareInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].TestRequestListenerMiddlewareInfoID.ToString(),
        TestRequestListenerMiddlewareIPAddress = TestRequestListenerMiddlewareInfoCS.MiddlewareInfoGLRepository[0].MiddlewareIPAddress.ToString(),
        TestRequestListenerMiddlewarePort = TestRequestListenerMiddlewareInfoCS.MiddlewareInfoGLRepository[0].MiddlewarePort.ToString(),
        TestResultsListenerMiddlewareInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].TestResultsListenerMiddlewareInfoID.ToString(),
        TestResultsListenerMiddlewareIPAddress = TestResultsListenerMiddlewareInfoCS.MiddlewareInfoGLRepository[0].MiddlewareIPAddress.ToString(),
        TestResultsListenerMiddlewarePort = TestResultsListenerMiddlewareInfoCS.MiddlewareInfoGLRepository[0].MiddlewarePort.ToString(),
        MESInfoID = TestInfoLogCS.TestInfoLogGLRepository[0].MESInfoID.ToString(),
        MESIPAddress = MESInfoCS.MESInfoGLRepository[0].MESIPAddress.ToString(),
        MESPort = MESInfoCS.MESInfoGLRepository[0].MESPort.ToString(),
        TestResults = TestResults,
        TestCompleteFlag = TestInfoLogCS.TestInfoLogGLRepository[0].IsTestCompleteFlag.ToString(),
        Success = TestInfoLogCS.TestInfoLogGLRepository[0].SuccessFlag.ToString(),
        Error = TestInfoLogCS.TestInfoLogGLRepository[0].Errorcode.ToString(),
    }) ;
    return true;
}  

現在我將測試結果消息存儲庫序列化為字符串

TestResultRequestMessageInfoCS.p_TestResultRequestMessage = JsonConvert.SerializeObject(TestResultRequestMessageInfoCS.TestResultRequestMessageInfoGLRepository, Formatting.None); 

請在下面找到測試結果請求消息。 它在 TestResult 屬性中具有轉義字符。 我怎樣才能擺脫他們?

{"TransactionID":"06cea8a2-b4d3-40b0-8380-2ed79f9c1179","TestInfoLogID":"17","TestInfoID":"35","BusinessUnitOverhead":"M1422","PID":"PID123456","TestDescription":"Cleantech - 2 Fuel Pump Assembly","DeviceInfoID":"5","DeviceIPAddress":"192.168.50.115","DevicePort":"43700","ProcessTestResultsServiceInfoID":"21","ProcessTestResultsServiceIPAddress":"192.168.50.115","ProcessTestResultsServicePort":"89","StartTesterServiceInfoID":"20","StartTesterServiceIPAddress":"192.168.50.115","StartTesterServicePort":"86","ClientTesterInfoID":"12","ClientTesterIPAddress":"192.168.50.115","ClientTesterPort":"87","TestRequestListenerMiddlewareInfoID":"23","TestRequestListenerMiddlewareIPAddress":"192.168.50.115","TestRequestListenerMiddlewarePort":"85","TestResultsListenerMiddlewareInfoID":"24","TestResultsListenerMiddlewareIPAddress":"192.168.50.115","TestResultsListenerMiddlewarePort":"43600","MESInfoID":"11","MESIPAddress":"192.168.50.115","MESPort":"88","ProtocolInfoID":"2","SerialNumber":"20210923-000001","TestCompleteFlag":"True","TestCompleteDateTime":"10/6/2021 11:05:08 AM","TestResults":["{\"TestResultSequenceID\":\"1\",\"ActionInfoID\":\"4\",\"Description\":\"Motor 1 amparage draw:\",\"TimeStamp\":\"10/6/2021\",\"AmpDraw\":\"3.4 Amperage\"}","{\"TestResultSequenceID\":\"2\",\"ActionInfoID\":\"5\",\"Description\":\"Motor 2 amparage draw:\",\"TimeStamp\":\"10/6/2021\",\"AmpDraw\":\"3.4 Amperage\"}","{\"TestResultSequenceID\":\"3\",\"ActionInfoID\":\"6\",\"Description\":\"Fuel pump sock pressed onto assembly:\",\"TimeStamp\":\"10/6/2021\",\"PressedOnFlag\":\" True\"}","{\"TestResultSequenceID\":\"4\",\"ActionInfoID\":\"7\",\"Description\":\"Component pump 1 serial barcode label:\",\"TimeStamp\":\"10/6/2021\",\"ComponentPump1SerialNumber\":\"20210930000001\"}","{\"TestResultSequenceID\":\"5\",\"ActionInfoID\":\"8\",\"Description\":\"Component pump 2 serial barcode label:\",\"TimeStamp\":\"10/6/2021\",\"ComponentPump2SerialNumber\":\"20210930000002\"}","{\"TestResultSequenceID\":\"6\",\"ActionInfoID\":\"9\",\"Description\":\"Fuel pump assembly serial number:\",\"TimeStamp\":\"10/6/2021\",\"AssemblySerialNumber\":\"20210930000003\"}"],"Success":"True","Error":"","RequestMessageSource":"FuelPumpTester","RequestMessageType":"TestResult"}

                             

我通過反序列化為動態 jobject 解決了這個問題。 將 jobject(測試結果)傳遞到加載存儲庫方法中。 構建測試結果請求消息后,將存儲庫序列化為字符串。 這對我有用。

string testresultsarraystring = "[" + TestResultRequestMessageInfoCS.p_TestResultRequestMessage + "]";
dynamic data = JsonConvert.DeserializeObject<dynamic>(testresultsarraystring);
TestResultRequestMessageInfoCS.LoadTestResultRequestMessageInfoGLRepository(data);

在這種情況下,反斜杠是引號的轉義字符。 Json 格式要求鍵值在引號內。 如果我們想在 c# 中存儲 json 字符串,我們不能這樣做:

string jsonString = "{ "name" : "John" }";

對於將此 json object 存儲為實際字符串的語言,我們需要編寫

string jsonString = "{ \"name\": \"John\" }";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM