【问题标题】:Don't deserialize nested JSON string不要反序列化嵌套的 JSON 字符串
【发布时间】:2018-04-17 08:54:43
【问题描述】:

如果我有一个 JSON 属性,其中包含另一个 JSON 块的 字符串,不是实际的 JSON,而是包含 JSON 的字符串,我如何阻止 Deserialize 尝试反序列化该字符串?

FIG A:我的 JSON 字符串示例结构:

{
    "name" : "parent",
    "data" : "{
        "name" : "child",
        "data" : "foobar",
        }",
}

图 B:普通嵌套 JSON 示例

{
    "name" : "parent",
    "data" : 
    {
        "name" : "child",
        "data" : "foobar",
    },
}

因此,当我反序列化 FIG A 中的父对象时,我应该得到一个具有 2 个字符串属性的对象,一个称为“名称”,包含“父”,一个称为“数据”,包含'{ "name" : "child", "data" : "foobar" }'

但是当我尝试这样做时,我得到一个错误

这是它试图解析的确切 JSON

"{ \"result\" : true, \"status\" : \"success\", \"data\" : \"{ \"id\" : 1, \"name\" : \"demo\", \"pixeldata\" : [{ \"time\" : \"1\", \"colour\" : \"#ff5357\"},{ \"time\" : \"2\", \"colour\" : \"#2424ff\"},{ \"time\" : \"3\", \"colour\" : \"#ff0d13\"},{ \"time\" : \"4\", \"colour\" : \"#f7ff4a\"},{ \"time\" : \"5\", \"colour\" : \"#fa24ff\"},{ \"time\" : \"6\", \"colour\" : \"#ff3e43\"}] }\" }"

这是确切的错误消息:

"After parsing a value an unexpected character was encountered: i. Path 'data', line 1, position 54."

这是它应该解析成的结构

public struct ServerResponse
{
    public bool result;
    public string status;
    public string data;
}

public struct Display
{
    public int id;
    public string name;
    public Data[] pixeldata;
}

public struct Data
{
    public float time;
    public string colour;
}

这是导致异常的确切代码行:

response = JsonConvert.DeserializeObject<API.ServerResponse>(_raw_response_data);

有什么线索吗?

【问题讨论】:

  • 是的,意外的字符是双引号。这不是字符串中的 JSON 的事实。是内部JSON中的双引号没有转义,所以它创建了无效的语法

标签: c# json


【解决方案1】:

根本原因在于您作为示例提供的字符串的序列化,(您说它是它试图解析的确切 JSON)

\"data\" : \"{ \"id\" : 1, 是:"data" : "{ "id" : 1

数据字符串内部的双引号不会被转义。

应该是

\"data\" : \"{ \\\"id\\\" : 1,,即"data" : "{ \"id\" : 1

【讨论】:

  • 谢谢,我在添加到父级之前对其进行了编码,并且效果很好!
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2018-09-03
  • 2018-03-02
  • 2022-01-20
  • 2021-04-12
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多