如何在C#中解析复杂的嵌套JSON字符串?

如何在C#中解析复杂的嵌套JSON字符串?,c#,json,C#,Json,我有一个丑陋的JSON字符串,它是从如下API返回的(这是Console.Write对字符串的结果): 我试图以最简单的方式将其解析为C#对象,这样我就可以访问像foo和bar这样的属性。但是我做这件事很困难 我尝试了多种方法对其进行解析,包括: // code to get the response string client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); var serializedData =

我有一个丑陋的JSON字符串,它是从如下API返回的(这是
Console.Write
对字符串的结果):

我试图以最简单的方式将其解析为C#对象,这样我就可以访问像
foo
bar
这样的属性。但是我做这件事很困难

我尝试了多种方法对其进行解析,包括:

// code to get the response string
client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
var serializedData = "{data: 'data'}";
var responseString = client.UploadString(url, "POST", serializedData);

// parse the response string
dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
这允许我访问
d
的值,这是我需要解析的实际字符串。然后我尝试使用
JArray.parse(obj[“d”])
分别解析它,但我得到一个错误,即
obj[“d”]
不是数组

不幸的是,我无法访问API本身,因此无法修改它序列化返回数据的方式


有什么建议吗?

您可以替换所有
新行
反斜杠
双引号
来格式化JSON

var formattedJson =  jsonString.Replace(@"\n", string.Empty)
                               .Replace(@"\", string.Empty)
                               .Replace("\"\"", string.Empty);
Console.WriteLine(formattedJson);
输出

{
    "d": [
        {
            "foo": 15,
            "bar": null
        }
    ]
}
15
转换成JArray

var jArray = JArray.Parse(JObject.Parse(formattedJson)["d"].ToString());
Console.WriteLine($"{jArray[0]["foo"]} {jArray[0]["bar"]}");
输出

{
    "d": [
        {
            "foo": 15,
            "bar": null
        }
    ]
}
15

问题是
“d”
的值是一个字符串,表示一个字符串,表示一个字符串。。。表示数组的。您可以将其称为JSON序列化“inception”

处理此问题的方法是反序列化相应次数的值。如果确定该值永远不会是实际字符串,则可以这样做,而不必知道该值序列化了多少次:

var myObject = JObject.Parse(s);
var d = myObject["d"];
while(d.Type == JTokenType.String)
    d = JToken.Parse(d.ToObject<string>());
myObject["d"] = d;

很好地替换转义字符,但是我不会依赖console.write命令作为检查的最终输出。以下是其他几种方法:-

  • 使用Postman进行API调用,以便可以看到原始结果。这将(希望)以易于阅读的格式显示它,然后您可以定义要反序列化的类
  • 将原始响应写入“.json”文件。在一个好的编辑器(如VS代码或VS本身)中打开该文件,查看接收数据时数据的实际结构

  • 另一方面,我建议使用RestSharp进行REST调用,使用Newtonsoft.Json进行序列化/反序列化。

    这并不像看上去那么“糟糕”。“\”是.NET转义字符。而获得转义字符的通常方法是转义转义字符。因此,这是一组转义引号(“)和backshlass()。内置类应该没有处理它的特殊问题。未转义的JSON类似于
    {“d”:“[{\“foo\”:15,\“bar\”:null}]”“}
    ,很容易解析,不包括前导和尾随的“this is a string”“Qutation mark,这是非调试器使用人工/删除Escapoe字符的情况:'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''。如何解析洋葱风格的json——不,这不是API应该返回的内容。谢谢!您和@Grx70都给出了非常有用的答案。