.net 将对象列表反序列化为其他集合类型
我有一些建议:.net 将对象列表反序列化为其他集合类型,.net,json,json.net,deserialization,.net,Json,Json.net,Deserialization,我有一些建议: { "id": "e296c8d9-22f6-4326-8630-06d3df9d6375", "body": { "action": "update", "entity": "data", "items": [ { "id": 4703419
{
"id": "e296c8d9-22f6-4326-8630-06d3df9d6375",
"body": {
"action": "update",
"entity": "data",
"items": [
{
"id": 470341982
},
{
"id": 470341983
},
{
"id": 470341984
},
]
}
}
我还有一套课程:
class Root
{
[JsonProperty("id")]
public string ID { get; set; }
[JsonProperty("body")]
public XBody Body { get; set; }
}
class XBody
{
[JsonProperty("action")]
public string Action { get; set; }
[JsonProperty("entity")]
public string Entity { get; set; }
[JsonProperty("items")]
public List<DataItem> DataItems { get; set; }
}
class DataItem
{
[JsonProperty("id")]
public long ID { get; set; }
}
类根目录
{
[JsonProperty(“id”)]
公共字符串ID{get;set;}
[JsonProperty(“主体”)]
公共XBody主体{get;set;}
}
XBody类
{
[JsonProperty(“action”)]
公共字符串操作{get;set;}
[JsonProperty(“实体”)]
公共字符串实体{get;set;}
[JsonProperty(“项目”)]
公共列表数据项{get;set;}
}
类数据项
{
[JsonProperty(“id”)]
公共长ID{get;set;}
}
使用Newtonsoft.Json库,我可以:
var myRoot = JsonConvert.DeserializeObject<Root>(json);
var myRoot=JsonConvert.DeserializeObject(json);
一切正常,但我在XBody
对象中有List
。对我来说,用DataItem.ID
属性值填充List
类型的属性就足够了
是否有可能在不保留列表数据项
的情况下动态执行该转换,而只使用列表ID
属性
也许可以使用Newtonsoft.Json库的基础结构创建一些额外的自定义转换器?是的,您可以使用一个简单的
JsonConverter
类将项
对象数组展平为长列表,从而消除对数据项
类的需要
以下是转换器所需的代码:
class ItemListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<long>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return JArray.Load(reader)
.Children<JObject>()
.Select(jo => (long)jo["id"])
.ToList();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后,当您反序列化时,它应该按照您想要的方式工作
这里有完整的演示:您想保留其他属性,还是只有
列表ID
?你可以使用var-ID=DataItems.Select(i=>i.ID)
反序列化后,我还需要XBody中的其他属性,但不是List-DataItems
而是List-ID
我想JsonConverterAttribute
对于List-ID
可能有帮助,但我不知道如何实现json-read()
很高兴我能帮忙!
class XBody
{
...
[JsonConverter(typeof(ItemListConverter))]
public List<long> IDs { get; set; }
}