【问题标题】:How to get values from dynamic array?如何从动态数组中获取值?
【发布时间】:2021-01-08 11:42:01
【问题描述】:

我已经使用动态对象反序列化了字符串。

因为属性名称是动态变化的。所以不能用 DTO 对象反序列化。

请查找代码sn-p:

var result = "[{\"series1\":\"{\\\"Category1\\\":4.3,\\\"Category2\\\":2.5,\\\"Category3\\\":3.5}\"},{\"series2\":\"{\\\"Category1\\\":2.4,\\\"Category2\\\":4.4,\\\"Category3\\\":1.8}\"},{\"series3\":\"{\\\"Category1\\\":2,\\\"Category2\\\":2,\\\"Category3\\\":3}\"}]");

var jsonResult = JsonConvert.DeserializeObject<dynamic[]>(jsonText);

如何检索series1和category1、2、3的结果?

你能帮我解决这个问题吗?

【问题讨论】:

  • 你有没有把 json 塞进 json 里面?

标签: c# json object dynamic deserialization


【解决方案1】:

您将遇到的问题是您在 json 中填充了 json - 从那里有双重转义序列这一事实显而易见。所以获取series1 相当简单:

var jsonResult = JsonConvert.DeserializeObject<dynamic[]>(result);
Console.WriteLine(jsonResult[0]["series1"]);

但这本身就是另一个 json 字符串。所以你需要再次解析它以获得Category1等:

var jsonResult = JsonConvert.DeserializeObject<dynamic[]>(result);
var series1Result = JsonConvert.DeserializeObject<dynamic>(jsonResult[0]["series1"].ToString());
Console.WriteLine(series1Result["Category1"]); // 4.3

现场示例:https://dotnetfiddle.net/hcACrM

【讨论】:

  • 感谢 jamiec 的回复。工作真棒!
【解决方案2】:

正如@Jamiec 提到的,需要考虑内联 JSON 字符串;所以,你将不得不反序列化两次。

对于这个答案,我们将完全避免使用dynamic(不创建自定义JsonConverter)并避免使用JObject(即IDictionary&lt;string, JToken&gt;);


我们将为类别定义一个类型。 (对于第二种,迭代反序列化)

    public class Categories
    {
        public double Category1 { get; set; }
        public double Category2 { get; set; }
        public double Category3 { get; set; }
    }

我们将用IEnumerable&lt;IDictionary&lt;string, string&gt;&gt; 替换dynamic[]。每个字典实际上只有一个条目,因此我们将在迭代处理中使用string.Join() 简单地连接KeysValues

    var jsonText = "[{\"series1\":\"{\\\"Category1\\\":4.3,\\\"Category2\\\":2.5,\\\"Category3\\\":3.5}\"},{\"series2\":\"{\\\"Category1\\\":2.4,\\\"Category2\\\":4.4,\\\"Category3\\\":1.8}\"},{\"series3\":\"{\\\"Category1\\\":2,\\\"Category2\\\":2,\\\"Category3\\\":3}\"}]";

    var jsonResult = JsonConvert.DeserializeObject<IEnumerable<IDictionary<string, string>>>(jsonText);

    var r = jsonResult.Select(i => 
    {
        (string Series, Categories Categories) result = (string.Join(string.Empty, i.Keys), JsonConvert.DeserializeObject<Categories>(string.Join(string.Empty, i.Values)));
        return result;
    }).ToArray();

(最后一部分使用解构到ValueTuple

dynamic 这里实际上是一个JObject,它实现了IDictionary&lt;string, JToken&gt;JToken 相当灵活(实际上它可以与上面的 sn-p 一起使用 - 包括 string.Join 的用法),但根据范围和偏好,我们反序列化为原始 string

【讨论】:

    【解决方案3】:

    试试 jsonResult["series1"]["Category"]

    【讨论】:

    • 工作得很好,感谢您的回复:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多