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

时间:2014-10-16 12:36:05

标签: c# .net json string

我正在与第三方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字符串有一个好主意?

4 个答案:

答案 0 :(得分:18)

这基本上是JSON编码的 as 一个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": ""
    }
  }
}

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

答案 1 :(得分:5)

通过使用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);

答案 2 :(得分:0)

呃......那根本不是JSON。这是一个奇怪的类似JSON的模仿,但是非常讨厌。我认为你做的是正确的事。

我唯一能做的就是对字符对进行替换操作,而不仅仅是单个转义字符:

myString.Replace(@"\""", @"""); // replace \" with "

这将允许您安全地保留嵌套的“\”chararcters,以便过滤的JSON看起来像:

field_blah: "root\branch\sub-branch"

我强烈建议对“JSON”文本进行详细审核,并确保这是您需要担心的唯一配对序列。如果您有其他配对,请按照上述方式处理它们。

答案 3 :(得分:0)

var JsonRequest = JToken.Parse(rawjson).ToString(Newtonsoft.Json.Formatting.None);