C# Json:如何使用Json.net正确剥离转义字符
我有以下格式的json响应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\\\":
"[{\\\"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响应字符串来解决这个问题吗
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);