簡體   English   中英

如何將對象樹反序列化為DTO?

[英]How do I deserialize a tree of objects into a DTO?

我試圖反序列化返回到DTO的JSon對象樹。 該樹最多可以有4個級別的深度,並超過1200個節點。 該代碼是使用Newtonsoft.Json進行反序列化的C#。

編輯

JSon看起來像:

[
{
    "id": 1095,
    "name": "Item1-1",
    "children": [
        {
            "id": 1097,
            "name": "Item2-2",
            "children": [
                {
                    "id": 18,
                    "name": "Item3-3",
                    "children": [
                        {
                            "id": 19,
                            "name": "Item4-4",
                            "children": [],
                            "level": 4,
                            "parentId": 18
                        },
                        {
                            "id": 20,
                            "name": "Item5-4",
                            "children": [],
                            "level": 4,
                            "parentId": 18
                        }
                    ],
                    "level": 3,
                    "parentId": 1097
                }
                ],
                "level": 2,
                "parentId": 1095
        }
    ],
    "level": 1,
    "parentId": null
}
]

我的DTO與此類似:

public class MyDTO
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("children")]
    public MyDTO[] Children { get; set; }
    [JsonProperty("level")]
    public int Level { get; set; }
    [JsonProperty("parentId")]
    public int ParentId { get; set; }

    public MyDTO()
    {
    }
}

我喜歡此鏈接中的Brian Rogers解決方案,該解決方案將json反序列化為對象: 如何使用JSON.NET反序列化為嵌套/遞歸Dictionary和List?

 public static class JsonHelper
{
    public static object Deserialize(string json)
    {
        return ToObject(JToken.Parse(json));
    }

    private static object ToObject(JToken token)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                return token.Children<JProperty>()
                            .ToDictionary(prop => prop.Name,
                                          prop => ToObject(prop.Value));

            case JTokenType.Array:
                return token.Select(ToObject).ToList();

            default:
                return ((JValue)token).Value;
        }
    }
}

我用object obj = JsonHelper.Deserialize(jsonString);調用object obj = JsonHelper.Deserialize(jsonString);

我一直在嘗試將此代碼轉換為可轉換為MyDTO的方法,但是我一直遇到編譯器錯誤。 我試圖簡單地使用MyDTO轉換JValue強制轉換,然后轉到帶有列表的列表。

我的目標是調用MyDTO obj = JsonHelp.Deserialize(jsonString)並獲取MyDTO對象的樹。 是否可以做我想做的事情,還是應該找到一種將每個對象投射到MyDTO的方法?

首先,您的JSON缺少brakcet ] ,然后您的模型需要可為null的parentId 進行一些簡單的更改,便可以使用JsonConvert.DeserializeObject<IEnumerable<MyDTO>>(json)

因此,您的JSON應該如下所示:

[
{
    "id": 1095,
    "name": "Item1-1",
    "children": [
        {
            "id": 1097,
            "name": "Item2-2",
            "children": [
                {
                    "id": 18,
                    "name": "Item3-3",
                    "children": [
                        {
                            "id": 19,
                            "name": "Item4-4",
                            "children": [],
                            "level": 4,
                            "parentId": 18
                        },
                        {
                            "id": 20,
                            "name": "Item5-4",
                            "children": [],
                            "level": 4,
                            "parentId": 18
                        }
                    ],
                    "level": 2,
                    "parentId": 1095
                }],
            }],
    "level": 1,
    "parentId": null
}
]

可以使用以下模型反序列化:

public class MyDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public MyDTO[] Children { get; set; }
    public int Level { get; set; }
    public int? ParentId { get; set; }
}

使用此代碼:

var dto = JsonConvert.DeserializeObject<IEnumerable<MyDTO>>(json);

暫無
暫無

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

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