【问题标题】:Mapping a json array (without keys) to a class object C#将 json 数组(不带键)映射到类对象 C#
【发布时间】:2021-08-16 19:10:39
【问题描述】:

我需要一些帮助来映射没有键的 json 数组。例如:

[
    "value1",
    234,
    3034,
    "data",
 [
    "some value",
    null,
    2020
 ],
]

我根据收到的这些值创建了一个类,但我无法映射到类对象。我可以使用动态变量访问这些数据,例如:

dynamic object = DataFromJson();
var firstvalues = object[0]; // "value1"

我的 json 太大了,里面有很多数组,所以用索引访问是一个很大的过程。

有人知道如何访问此类数据并映射到类吗?

【问题讨论】:

  • @DmitriyGrebennikov 这是完全有效的 JSON。它是一个单独的 JSON 值(一个数组),其中包含其他 json 值(字符串/数字/空值/布尔值)的其他 JSON 值(数组)。
  • 如果它没有固定格式(元素 1 包含 4 项,元素 2 包含 3 项),则无法对其进行反序列化。您要么必须更改它以使用密钥,要么必须手动解析数据并构建自己的对象。
  • 您使用的是什么序列化程序?如果使用 Json.NET,请参阅How to deserialize an array of values with a fixed schema to a strongly typed data class?
  • 然后告诉我们你是如何识别进入你的课程的价值观的,我们可以告诉你如何去做。
  • 您可以使用JArray jsonArray = JArray.Parse(DataFromJson()); .. 使用jsonArray.Children() 您可以使用LINQ 表达式来获取任何属性的值。

标签: c# json mapping


【解决方案1】:

我收到了很多关于这方面的反馈(谢谢!),所以这是结论:

  • 作为 JSON 数组,此类信息无法正确映射到类对象。这不是功能提案。

  • JArray 非常有助于在所有信息之间进行交互,然后将其带到一个类中。如果需要,您可以手动创建一个特定方法以将每个值包含在您的类对象中。

  • 另一种选择是使用动态对象,作为索引访问。

  • 确保不能以其他方式接收此信息,作为带有键和值的 JSON,并映射到类。

如果有一些有用的更新,我会在这里编辑。

【讨论】:

    【解决方案2】:

    有一个选项可用,使用Cinchoo ETL - 一个开源库,可将此类数据加载到开箱即用的对象中。

    如下定义对象

    [ChoSourceType(typeof(object[]))]
    [ChoTypeConverter(typeof(ChoArrayToObjectConverter))]
    public class foo
    {
        [ChoArrayIndex(0)]
        public long prop1 { get; set; }
        [ChoArrayIndex(1)]
        public double prop2 { get; set; }
    }
    

    然后解析JSON如下

    string json = @"
    [
        [
            1618170480000,
            ""59594.60000000"",
            ""59625.00000000"",
            ""59557.13000000""
        ],
        [
            1618170540000
        ]
    ]";
    
    using (var r = ChoJSONReader<foo>.LoadText(json))
    {
        foreach (var rec in r)
            Console.WriteLine(ChoUtility.Dump(rec));
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多