如何安全地将包含转义JSON的字符串转换为有效的JSON?
我正在与第三方API进行通信,该API返回JSON响应,如下所示:
"{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}"
它是一种JSON ……但是作为一个字符串。 注意第一个和结尾的双引号,当然还有所有的转义斜杠。
目前,我通过String解决这个问题。放置反斜杠以及第一个和最后一个引号。 在那之后,我能够解析它。
mystring.Replace("\\", "");
但是,如果其中一个属性实际上有一个反斜杠作为值呢? 例如:
\"SecondAttribute\":\"My Super Back Slash: \\ . That was it.\"
在这种情况下,我会不小心删除值中应该存在的反斜杠。
有没有人对如何正确解析这个JSON字符串有一个好主意?
这基本上是JSON编码为 JSON字符串 – 根据评论稍微对字符串结尾进行处理。 在Json.NET中处理它并不太难,首先使用JToken.Parse
有效地进行unescape,然后解析结果:
using System; using System.IO; using Newtonsoft.Json.Linq; class Program { static void Main(string[] args) { string text = File.ReadAllText("test.json"); JToken token = JToken.Parse(text); JObject json = JObject.Parse((string) token); Console.WriteLine(json); } }
输出:
{ "SomeResponse": { "FIrstAttribute": 8, "SecondAttribute": "On", "ThirdAttribute": { "Id": 2, "FirstName": "Okkie", "Name": "Bokkie", "Street": "", "StreetNumber": null, "PostCode": "", "City": "", "Country": "" } } }
即使数据包含反斜杠,这应该没问题,因为我希望反斜杠再次被编码 – 但值得仔细检查。
using Newtonsoft.Json; String json="{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}"; dynamic result = JsonConvert.DeserializeObject(json);
呃……根本不是JSON。 这是一个奇怪的类似JSON的模仿,但是非常讨厌。 我认为你做的是正确的。
我唯一能做的就是对字符对进行替换操作,而不仅仅是单个转义字符:
myString.Replace(@"\""", @"""); // replace \" with "
这将允许您安全地保留嵌套的“\”chararcters,以便过滤的JSON看起来像:
field_blah: "root\branch\sub-branch"
我强烈建议对“JSON”文本进行详细审查,并确保这是您需要担心的唯一配对序列。 如果您有其他配对,请按照上述方式处理它们。