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