[英]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.