我向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>
帮助表示感谢!
答案 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"]);