【问题标题】:C# How do I correctly deserialize multiple custom objects in an array to an object?C#如何正确地将数组中的多个自定义对象反序列化为一个对象?
【发布时间】:2019-12-04 19:46:42
【问题描述】:

我正在检索一个包含多个对象类型的数组的 json 对象。

假设我检索到如下所示的 JSON 有效负载:

{
   "Lines": [
   {
       "PropertyA": "A",
       "PropertyB": "B"
   },
   {
       "Property01": 1,
       "Property02": 2
   }]
}

我想将其反序列化为单个对象列表。

例子:

public List<Line> Lines;

所以我可以将对象与我期望的对象进行比较。

到目前为止我所拥有的:

public class Class1
{
    public string PropertyA = "A";
    public string PropertyB = "B";
}

public class Class2
{
    public int Property01 = 01;
    public int Property02 = 02;
}

public class MainClass
{
    public List<dynamic> Lines;
}

class Program
{
    static void Main(string[] args)
    {
        string json = "{\r\n \"Lines\": [\r\n {\r\n \"PropertyA\": \"A\",\r\n \"PropertyB\": \"B\"\r\n },\r\n {\r\n \"Property01\": 1,\r\n \"Property02\": 2\r\n }]\r\n}";

        MainClass actual = JsonConvert.DeserializeObject<MainClass>(json);

        MainClass expected = new MainClass()
        {
            Lines = new List<dynamic>()
            {
                new Class1(),
                new Class2()
            }
        };

        actual.Should().BeEquivalentTo(expected);
    }
}   

任何帮助将不胜感激!

干杯

【问题讨论】:

  • 你的内部部分(propa、propb 和 prop1、prop2)将反序列化为 JSON 数组,而不是你可以反序列化为你想要的类的东西。您必须浏览数组并获取数据。

标签: c# json deserialization json-deserialization


【解决方案1】:

您可以像这样验证专有名称并在正确的对象中反序列化

class Program
{
    static void Main(string[] args)
    {

        var class1List = new List<Class1>();
        var class2List = new List<Class2>();
        var genericList = new List<dynamic>();

        var actual = JsonConvert.DeserializeObject<dynamic>(json);
        foreach (var item in actual.Lines)
        {

            string itemJson = JsonConvert.SerializeObject(item);
            if (itemJson.Contains("PropertyA"))
            {
                var class1 = JsonConvert.DeserializeObject<Class1>(itemJson);
                class1List.Add(class1);
                genericList.Add(class1);
            }
            else
            {
                var class2 = JsonConvert.DeserializeObject<Class2>(itemJson);
                class2List.Add(class2);
                genericList.Add(class2);
            }
        }
    }
}

public class Class1
{
    public string PropertyA;
    public string PropertyB;
}

public class Class2
{
    public int Property01;
    public int Property02;
}

【讨论】:

  • 谢谢。像你在这里展示的那样自己解析它可能是我做到这一点的最佳方式,同时保持我的课程分开。
【解决方案2】:

首先将字段更改为属性。那么这里最简单的方法是创建一个表示两个对象的通用对象,如下所示:

public class Class1
{   
    public string PropertyA {get;set;}
    public string PropertyB {get;set;}
    public int Property01 {get;set;}
    public int Property02 {get;set;}
}

public class MainClass
{
    public List<Class1> Lines;
}

反序列化看起来像这样:

 MainClass actual = JsonConvert.DeserializeObject<MainClass>(json);

如果您将 Class1 的类定义更改为具有可为空属性的对象,您将能够检测 json 中是否存在属性以区分两个对象:

public class Class1
{   
    public string PropertyA {get;set;}
    public string PropertyB {get;set;}
    public int? Property01 {get;set;}
    public int? Property02 {get;set;}
}

另一种方法是使用 JArray 并使用此对象继续您的逻辑:

JArray arr = JArray.Parse(json);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多