无法解析格式正确的JSON

时间:2019-05-01 20:50:52

标签: c# json.net

我向API发出请求,并且能够解析成功响应结果(response.Content.ReadAsStringAsync().Result),但是当我收到失败响应时(他们会抛出JObject.Parse()JToken.Parse()无法解析看似格式正确的JSON结果。

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        var result = "\"{\\\"error\\\":{\\\"detail\\\":\\\"java.lang.NullPointerException\\\",\\\"message\\\":\\\"Error occured while setting field 'caller_id' with value null\\\"},\\\"status\\\":\\\"failure\\\"}\"";

        var jObject = JObject.Parse(result);

        Console.WriteLine(jObject["error"]["message"]);
    }
}

例外:

  

运行时异常(第10行):从JsonReader读取JObject时出错。   当前JsonReader项不是对象:字符串。路径”,第1行   位置162。

堆栈跟踪:

  

[Newtonsoft.Json.JsonReaderException:从中读取JObject时出错   JsonReader。当前JsonReader项不是对象:字符串。路径'',   第1行,位置162。]在   Newtonsoft.Json.Linq.JObject.Load(JsonReader阅读器,JsonLoadSettings   设置)在Newtonsoft.Json.Linq.JObject.Parse(String json,   JsonLoadSettings设置)位于   Newtonsoft.Json.Linq.JObject.Parse(String json)在Program.Main()   :第10行

该异常指向字符串的最后,但我无法弄清缺少的内容。 https://jsonblob.com可以在我删除反斜杠之后进行解析,摆脱了撇号,我使用字符串和正则表达式替换“清理了它”,我变成了一个char数组并再次构建它,都无济于事。 / p>

帮助表示感谢!

2 个答案:

答案 0 :(得分:1)

当我用控制台编写您的json字符串时:

var result = "\"{\\\"error\\\":{\\\"detail\\\":\\\"java.lang.NullPointerException\\\",\\\"message\\\":\\\"Error occured while setting field 'caller_id' with value null\\\"},\\\"status\\\":\\\"failure\\\"}\"";

它返回:

"{\"error\":{\"detail\":\"java.lang.NullPointerException\",\"message\":\"Error occured while setting field 'caller_id' with value null\"},\"status\":\"failure\"}"

这不是正确的json字符串。您的json字符串必须如下所示:

var result = "{\"error\":{\"detail\":\"java.lang.NullPointerException\",\"message\":\"Error occured while setting field 'caller_id' with value null\"},\"status\":\"failure\"}"

因此,当您在控制台中编写此语句时,您将看到它在字符串下方生成了正确的json格式的字符串:

{"error":{"detail":"java.lang.NullPointerException","message":"Error occured while setting field 'caller_id' with value null"},"status":"failure"}

答案 1 :(得分:1)

您提供的字符串是格式正确的JSON。如果将某些数据序列化为JSON字符串,然后将该字符串序列化为JSON字符串,则将获得此结果。为了从原始JSON字符串中获取数据,因此您必须对其解析两次。

以下对我有用:

        var jToken = JToken.Parse(result);
        var jObject = JObject.Parse((string)((JValue)jToken).Value);

        Console.WriteLine(jObject["error"]["message"]);