【问题标题】:Unable to parse well formed JSON无法解析格式良好的 JSON
【发布时间】:2019-05-01 20:50:51
【问题描述】:

我向 API 发出请求,我能够解析 success 响应结果 (response.Content.ReadAsStringAsync().Result),但是当我得到 failure 响应时(“bad request"),看似格式正确的 JSON 结果无法被 JObject.Parse()JToken.Parse() 解析,他们抛出。

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 时出错 json阅读器。当前 JsonReader 项不是对象:字符串。小路 '', 第 1 行,位置 162。] 在 Newtonsoft.Json.Linq.JObject.Load(JsonReader 阅读器,JsonLoadSettings 设置)在 Newtonsoft.Json.Linq.JObject.Parse(字符串 json, JsonLoadSettings 设置)在 Program.Main() 处的 Newtonsoft.Json.Linq.JObject.Parse(String json) :第 10 行

异常指向字符串的最后,但我不知道缺少什么。 https://jsonblob.com 可以在我删除反斜杠后解析它,我去掉了撇号,我用字符串和正则表达式替换“清理它”,我变成了一个 char 数组并再次构建它,一切都无济于事。

帮助表示赞赏!

【问题讨论】:

  • 为什么你的字符串中有这么多斜线?我用这个字符串 var result = "{\"error\":{\"detail\":\"java.lang.NullPointerException\",\"message\":\"Error occured while setting field 'caller_id' with value null\"},\"status\":\"failure\"}"; 成功运行了你的代码。
  • 这就是从请求中返回的内容,我猜 C# 逃逸得更多。

标签: c# json.net


【解决方案1】:

您提供的字符串是格式正确的 JSON。如果您将一些数据序列化为 JSON 字符串 ,然后将该字符串序列化为 JSON 字符串,就会得到这样的结果。因此,要从原始 JSON 字符串中获取数据,您必须对其进行两次解析。

以下对我有用:

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

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

【讨论】:

  • 一百万年我都猜不到,谢谢!
【解决方案2】:

当我在控制台写下你的 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"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2010-12-20
    • 1970-01-01
    • 2011-08-02
    • 2011-02-03
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多