如何从可能无效的 JSON 字符串中提取内部对象?

How can I extract an inner object from a potentially invalid JSON string?

我从 API

那里得到了这个回复
{\r\n  \"VAL_VER_ZERO_TURN\" : {\r\n    \"J_ID\" : \"345\",\r\n    \"DIS_CODE\" : \"WV345\"\r\n  }\r\n}

我收到此字符串作为 webClient.DownloadString(uri) 的响应 但是当把它转换成JSON时,结果是空白。

JsonConvert.PopulateObject(响应,rockInfo);

当我尝试使用硬编码字符串(而不是 webClient.DownloadString(uri))时,它起作用了

response = {\"J_ID\" : \"345\",\r\n    \"DIS_CODE\" : \"WV345\"\r\n  }";

我在这里理解的是当我向它提供带有前导和尾随换行符的实习生 JSON 对象时它的工作原理。 但我不知道如何提取内部 JSON 对象。

我建议将 Json 转换为 Class (json2csharp) 并使用 JsonConvert.PopulateObject 来读取内部对象.下面是示例代码。

    public class VALVERZEROTURN
    {
        public string J_ID { get; set; }
        public string DIS_CODE { get; set; }
    }

    public class RootObject
    {
        public VALVERZEROTURN VAL_VER_ZERO_TURN { get; set; }
    }

    static void Main(string[] args)
    {
        string response = "{\r\n  \"VAL_VER_ZERO_TURN\" : {\r\n    \"J_ID\" : \"345\",\r\n    \"DIS_CODE\" : \"WV345\"\r\n  }\r\n}";
        RootObject rockInfo = new RootObject();
        JsonConvert.PopulateObject(response, rockInfo);

        Console.WriteLine($"J_ID: {rockInfo.VAL_VER_ZERO_TURN.J_ID}, DIS_CODE: {rockInfo.VAL_VER_ZERO_TURN.DIS_CODE} ");
    }

您可以使用 JObject.Parse(response) 访问不同的对象,就好像您正在遍历字典一样。

var jobject = JObject.Parse(response);

var abc = jobject["VAL_VER_ZERO_TURN"];

您可以继续深入了解每个结果。