C# Json:如何使用Json.net正确剥离转义字符

C# Json:如何使用Json.net正确剥离转义字符,c#,json,string,json.net,C#,Json,String,Json.net,我有以下格式的json响应 "[{\\\"JobID\\\":\\\"1\\\",\\\"BillGenerationDate\\\":\\\"4/29/2013 2:53:34 PM\\\",\\\"BillID\\\":\\\"115743\\\",\\\"BillNo\\\":\\\"115743\\\",\\\"CustomerID\\\":\\\"4041705\\\",\\\"PayStatus\\\":\\\"0\\\",\\\"PaymentRequiredStatus\\\":

我有以下格式的json响应

"[{\\\"JobID\\\":\\\"1\\\",\\\"BillGenerationDate\\\":\\\"4/29/2013 2:53:34 PM\\\",\\\"BillID\\\":\\\"115743\\\",\\\"BillNo\\\":\\\"115743\\\",\\\"CustomerID\\\":\\\"4041705\\\",\\\"PayStatus\\\":\\\"0\\\",\\\"PaymentRequiredStatus\\\":\\\"True\\\",\\\"ProductName\\\":\\\"Epic FBO test\\\",\\\"Description\\\":\\\"Epic Automation 2\\\\r\\\\n\\\",\\\"ProductType\\\":\\\"eBill \\\",\\\"DueType\\\":\\\"-1\\\",\\\"DueDate\\\":\\\"2013-03-15\\\",\\\"Amount\\\":\\\"63.70\\\",\\\"Cost\\\":\\\"\\\"},
{\\\"JobID\\\":\\\"9\\\",\\\"BillGenerationDate\\\":\\\"5/2/2013 10:21:39 AM\\\",\\\"BillID\\\":\\\"115743\\\",\\\"BillNo\\\":\\\"115743\\\",\\\"CustomerID\\\":\\\"4041705\\\",\\\"PayStatus\\\":\\\"0\\\",\\\"PaymentRequiredStatus\\\":\\\"True\\\",\\\"ProductName\\\":\\\"FBO Test Product\\\",\\\"Description\\\":\\\"FBO Product Test\\\",\\\"ProductType\\\":\\\"eBill \\\",\\\"DueType\\\":\\\"-1\\\",\\\"DueDate\\\":\\\"2013-05-01\\\",\\\"Amount\\\":\\\"150.70\\\",\\\"Cost\\\":\\\"\\\"}]
我相信json.net会处理转义字符,我使用下面的代码将其反序列化为字典集合

var billList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(contentCorrected);
var billList=JsonConvert.DeserializeObject(contentCorrected);
但这个json解析抛出异常 无效的属性标识符字符:。路径“[0]”,第1行,位置2 我们可以通过操纵json响应字符串来解决这个问题吗

  • 在反序列化之前,请删除所有“\”字符。使用替换功能

    yourJsonString.Replace(“\”,”)

  • 您的Json字符串不完整或似乎不是类型
    List“
    。请更正您希望转换Json的类型。 我对你的json做了如下修改,效果很好

    newJson=“{\'array\”:“+yourJsonString+”}”


  • 请在反序列化过程之前尝试
    string contentCorrected=contentCorrected。替换(@“\”,“”);

    对我来说,下面的代码可以工作

    string contentCorrected = contentCorrected.Replace(**@"\""", ""**);
    

    如果答案中使用了有效的双引号,则会出现此问题。在所有情况下,删除和/或替换并不能解决此问题。 这也让我很沮丧,直到我找到了一个简单的解决方案:

    var billList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(@contentCorrected);
    
    var billList=JsonConvert.DeserializeObject(@contentCorrected);
    
    简短回答:首先需要反序列化转义字符串,但不是目标CLR类型,而是反序列化为另一个字符串:

    // Initial example json string:  "\"{\\\"Property1\\\":1988,\\\"Property2\\\":\\\"Some data :D\\\"}\""
    
    
    // First, deserialize to another string (unescaped string).
    string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);
    Debug.WriteLine(unescapedJsonString);
    // Prints:
    // "{\"Property1\":1988,\"Property2\":\"Some data :D\"}"
    
    
    // Second, deserialize to another string, again (in this case is necessary)
    var finalUnescapedJsonString = JsonConvert.DeserializeObject<string>(unescapedJsonString);
    Debug.WriteLine(finalUnescapedJsonString);
    // This time prints a final, unescaped, json string:
    // {"Property1":1988,"Property2":"Some data :D"}
    
    
    // Finally, perform final deserialization to the target type, using the last unescaped string.
    MyClass targetObject = JsonConvert.DeserializeObject<MyClass>(finalUnescapedJsonString);
    

    它应该像
    contentCorrected=contentCorrected.Replace(@“\”,@“”)
    contentCorrected=contentCorrected.Replace(@“\”,string.Empty)
    这可能会导致无效的JSON现在,我发现这个答案有点“快而脏”。如果你仍然使用Newtonsoft来序列化Regex.Unescape,我会选择@Johan Alzate答案()。详细的解决方案可以在这里找到:Json.Parse(string)可能会有所帮助。如果这还没有编译,请参阅我的答案?已经在某个问题上纠缠了好几天了,谢谢!你完全正确!!
    // -- SERIALIZATION --
    
    // Initial object
    MyClass originObj = new MyClass { Property1 = 1988, Property2 = "Some data :D" };
    
    // "First level" Of serialization.
    string jsonString = JsonConvert.SerializeObject(originObj);
    Debug.WriteLine(jsonString);
    // Prints: 
    // {"Property1":1988,"Property2":"Some data :D"}
    
    
    // "Second level" of serialization.
    string escapedJsonString = JsonConvert.SerializeObject(jsonString);
    Debug.WriteLine(escapedJsonString);            
    // "{\"Property1\":1988,\"Property2\":\"Some data :D\"}"
    // Note the initial and final " character and de backslash characters
    
    // ...
    // at this point you could do more serializations ("More levels"), Obtaining as a result more and more backslash followed,
    // something like this:
    // "\"{\\\"Property1\\\":1988,\\\"Property2\\\":\\\"Some data :D\\\"}\""
    // Note that is... very very crazy :D
    // ...
    
    // -- DESERIALIZATION --
    
    // First deserialize to another string (unescaped string).
    string unescapedJsonString = JsonConvert.DeserializeObject<string>(escapedJsonString);
    Debug.WriteLine(unescapedJsonString);
    // Prints:
    // {"Property1":1988,"Property2":"Some data :D"}
    
    // ...
    // at this point you could repeat more deserializations to string, if necessary. For example if you have many backslash \\\
    // ...
    
    // Finally, perform final deserialization to the target type, using the last unescaped string.
    MyClass targetObject = JsonConvert.DeserializeObject<MyClass>(unescapedJsonString);