【问题标题】:Decode JSON string containing JSON string解码包含 JSON 字符串的 JSON 字符串
【发布时间】:2019-04-03 08:20:49
【问题描述】:

我必须解码一个包含另一个 JSON 字符串的 JSON 字符串。目前我正在尝试使用来自System.Web.Script.SerializationSerializator.Deserialize<Dictionary<string,string>>(value) 将其解码为Dictionary<string,string>,但没有成功。

这是字符串:

{
      "label": "Side",
      "options": [
        {
          "key": "left",
          "value": 0
        },
        {
          "key": "right",
          "value": 1
        }
      ]
}

这是我从解码器得到的格式错误:

(System.ArgumentException HResult=0x80070057 消息=传入的对象无效,预期为 ':' 或 '}'。(34): {"label": "Side", "options": "[{"key": "left", "value": 0},{"key":"right", "value":1}]"} Source=System.Web.Extensions) 这意味着他将“[{”作为字符串获取,因此当然无法转换......

有什么方法可以解码这个特定的 JSON 字符串并将其存储在一个对象中?客户对这种 JSON 格式非常具体……非常感谢

【问题讨论】:

  • 收到无效的 json 似乎很痛苦......
  • 您可能需要将 json 预解析为可以传递给反序列化器的内容。
  • tag info 中有一个指向 jsonlint 的链接。它是一个很好的验证和格式化工具。
  • JSON 字符串无效。请使用 jsonlint 纠正它。

标签: c# json json-deserialization


【解决方案1】:

像这样代表你的json

{
  "label": "Side",
  "options": "[{ 'key': 'left', 'value': '0'},{ 'key':'right', 'value':1}]"
}

json 内带单引号

假设你有这两个类:

public class YourObject
    {
        public string label { get; set; }
        public string options { get; set; }
    }
    public class InsideObject
    {
        public string key { get; set; }
        public int value { get; set; }
    }

所以你的 json 在键 "options" 下有另一个 json 作为字符串,你可以像这样提取它们:

 string json = "{\"label\": \"Side\", \"options\": \"[{ 'key': 'left', 'value': '0'},{ 'key':'right', 'value':1}]\"}";
 var jsonObj = JsonConvert.DeserializeObject<YourObject>(json);
 var insideObj = JsonConvert.DeserializeObject<InsideObject>(jsonObj.options);

附言 这里使用Newtonsoft

【讨论】:

  • 不起作用...一旦它到达第一个单独的 cuote,反序列化器就会认为这是字符串的结尾并抛出错误,因为它是结束 JSON 字符串的无效方式
  • 在我看来,提议 代表你的json (并以字符串的形式存储一个对象)在我看来与使用 Object 无处不在 :D
  • 我同意你的看法。我刚刚回答了他的问题:“...字符串包含另一个 JSON 字符串”。
【解决方案2】:

最后我使用的字符串格式如下:

{
  "label": "Side",
  "options": [
    {
      "key": "left",
      "value": 0
    },
    {
      "key": "right",
      "value": 1
    }
  ]
}

并将所有 JSON 存储在 Dictionary&lt; string, object &gt; 中。然后我将实现一个方法来解码 JSON 中的对象。

【讨论】:

    【解决方案3】:

    正如 Matt 在他的评论中已经提到的,您的 JSON 无效,而不是 "[{"key",应该是 [{"key",而不是 }]"},应该是 }]}

    【讨论】:

    • 只要我能从他们身上学到一些东西,我就完全没有反对投票的问题(没有任何评论是不可能的)。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多