Json:如何正确地剥离转义字符与json.net

本文关键字:转义字符 json net 剥离 正确地 Json | 更新日期: 2023-09-27 18:11:50

我有以下格式的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);

但是这个json解析会抛出异常"无效的属性标识符字符:。路径'[0]',第一行,位置2 "我们可以通过操纵json响应字符串来解决这个问题吗?

Json:如何正确地剥离转义字符与json.net

简短的回答:首先你需要反序列化转义的字符串,但不是目标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);

长答案(但有趣)使用string.Replace(...可能会生成一个无效的字符串,因为它可能会损坏某些需要反斜杠正确反序列化的特殊字符。

这种类型的转义字符串通常是在一个已经是json字符串的字符串再次序列化(甚至更多次)时生成的。这会导致类似于"不同级别的序列化"之类的事情。(它实际上是一个带有保留字符的字符串的序列化),结果是反斜杠字符(或者一组、两个或多个反斜杠后面跟着:',',''')分散在整个字符串中。因此,要正确地删除它们,仅仅将它们替换为空是不够的。

正确方法:获得未转义字符串的更好方法是首先对字符串类型进行反序列化(必要时重复几次),然后对目标CLR类型进行最后的反序列化:

// -- 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);

在反序列化之前尝试string contentCorrected = contentCorrected.Replace(@"'", "");

  1. 在反序列化之前删除所有"'"字符。使用replace函数

    yourJsonString。取代 ("'''''", ");

  2. 你的Json字符串是不完整的或似乎不是类型的List<Dictionary<string, string>>"。更正要转换json的类型。我修改了你的json如下,它工作了。

    newJson = "{ '" 数组'":"+ yourJsonString +"}"

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

var billList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(@contentCorrected);

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

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