如何反序列化使用未指定和可变属性名称的 JSON 对象

本文关键字:属性 对象 JSON 反序列化 未指定 | 更新日期: 2023-09-27 18:34:11

我有一个类似于这样的JSON响应(我无法控制):

{"response":{
  "a" : "value of a",
  "b" : "value of b",
  "c" : "value of c",
  ...
}}

哪里:

  • "A"、"B"、"C"是前面的未知名称。
  • 项目的数量可能会有所不同。

最后我所需要的只是一个所有值的字符串数组。保留名称是一个奖励(字典?),但我需要按它们出现的顺序浏览值。

您将如何使用 JSON.NET 实现这一目标?

如何反序列化使用未指定和可变属性名称的 JSON 对象

可以使用

Newtonsoft.Json.Linq 命名空间中的 JObject 类将对象反序列化为类似 DOM 的结构:

public class StackOverflow_10608188
{
    public static void Test()
    {
        string json = @"{""response"":{
          ""a"" : ""value of a"",
          ""b"" : ""value of b"",
          ""c"" : ""value of c""
        }}";
        JObject jo = JObject.Parse(json);
        foreach (JProperty property in jo["response"].Children())
        {
            Console.WriteLine(property.Value);
        }
    }
}

这有效,但不是很漂亮。我相信你可以和JavaScriptSerializer交换 json.net.

var json = "{'"response'":{'"a'":'"value of a'",'"b'":'"value of b'",'"c'":'"value of c'"}}";
var x = new System.Web.Script.Serialization.JavaScriptSerializer();
var res = x.Deserialize<IDictionary<string, IDictionary<string, string>>>(json);
foreach (var key in res.Keys)
{
    foreach (var subkey in res[key].Keys)
    {
        Console.WriteLine(res[key][subkey]);
    }
}

Console.WriteLine(res["response"]["a"]);
Console.WriteLine(res["response"]["b"]);
Console.WriteLine(res["response"]["c"]);

输出:

value of a
value of b
value of c
相关文章: