如何安全地将包含转义JSON的字符串转换为有效的JSON?

Gon*_*ioz 17 .net c# string json

我正在与第三方API进行通信,该API返回JSON响应,如下所示:

"{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}"
Run Code Online (Sandbox Code Playgroud)

它是一种JSON ......但是作为一个字符串.注意第一个和结尾的双引号,当然还有所有的转义斜杠.

目前,我通过String解决这个问题.放置反斜杠以及第一个和最后一个引号.在那之后,我能够解析它.

mystring.Replace("\\", "");
Run Code Online (Sandbox Code Playgroud)

但是,如果其中一个属性实际上有一个反斜杠作为值呢?例如:

\"SecondAttribute\":\"My Super Back Slash: \\ . That was it.\"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我会不小心删除值中应该存在的反斜杠.

有没有人对如何正确解析这个JSON字符串有一个好主意?

Jon*_*eet 23

这基本上是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "SomeResponse": {
    "FIrstAttribute": 8,
    "SecondAttribute": "On",
    "ThirdAttribute": {
      "Id": 2,
      "FirstName": "Okkie",
      "Name": "Bokkie",
      "Street": "",
      "StreetNumber": null,
      "PostCode": "",
      "City": "",
      "Country": ""
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

即使数据包含反斜杠,这应该没问题,因为我希望反斜杠再次被编码 - 但值得仔细检查.

  • 对我来说,这会抛出"无法将对象转换为字符串".将令牌转换为字符串时. (4认同)
  • @SriReddy:这是无效的 - 要创建一个带有反斜杠的字符串,你需要在JSON中使用双反斜杠,这意味着你的字符串文字中有一个*四倍*反斜杠,例如`var text ="{\"PersonName \" :\"Gol \\\\ ld \"}";`但这只是在文字中,而不是在JSON本身...... JSON只包含一个双反斜杠. (3认同)
  • @ShaunLuttin:目前尚不清楚你是否认为文本实际上有反斜杠.如果没有,你应该只使用`JObject.Parse(text)`.这个问题是关于JSON已经第二次编码为JSON字符串的情况. (2认同)

小智 6

通过使用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);
Run Code Online (Sandbox Code Playgroud)