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

本文关键字:JSON 转义 字符串 转换 有效 包含 何安全 安全 | 更新日期: 2023-09-27 18:26:55

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

"{'"SomeResponse'":{'"FIrstAttribute'":8,'"SecondAttribute'":'"On'",'"ThirdAttribute'":{'"Id'":2,'"FirstName'":'"Okkie'",'"Name'":'"Bokkie'",'"Street'":'"'",'"StreetNumber'":null,'"PostCode'":'"'",'"City'":'"'",'"Country'":'"}}}"

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

目前,我通过字符串来解决这个问题。替换反斜杠以及第一个和最后一个引号。之后,我可以解析它。

mystring.Replace("''", "");

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

'"SecondAttribute'":'"My Super Back Slash: '' . That was it.'"

在这种情况下,我会意外地删除值中应该存在的反斜杠。

有人知道如何正确解析这个JSON字符串吗?

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

这基本上是JSON编码的,作为一个JSON字符串-根据注释,在稍微修改了字符串的末尾之后。在Json.NET中处理这一点并不难,首先使用JToken.Parse有效地取消捕获,然后解析结果:

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": ""
    }
  }
}

即使数据包含反斜杠,这也应该很好,因为我希望反斜杠能再次编码——但值得仔细检查。

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

Ugh。。。这根本不是JSON。这是一个奇怪的类似JSON的模仿,但非常讨厌。我认为你做的是对的。

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

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

这将允许您安全地保留嵌套的"''"字符,以便过滤后的JSON看起来像:

field_blah: "root'branch'sub-branch"

我强烈建议对"JSON"文本进行详细审查,并确保这是您需要担心的唯一成对序列。如果您有其他配对,请按照上面列出的相同方式进行处理。

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