簡體   English   中英

C# 如何正確地將數組中的多個自定義對象反序列化為一個對象?

[英]C# How do I correctly deserialize multiple custom objects in an array to an object?

我正在檢索帶有數組的 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);
    }
}   

任何幫助將不勝感激!

干杯

首先將字段更改為屬性。 那么這里最簡單的方法是創建一個表示兩個對象的公共對象,如下所示:

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);

您可以像這樣驗證專有名稱並在正確的對象中反序列化

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM