C# 使用Newtonsoft简化对象的反序列化

C# 使用Newtonsoft简化对象的反序列化,c#,json.net,C#,Json.net,我有JSON,如下所示: [ { "id": 7, "name": "Example 1", "player_class": 2, "player_class_name": "Class1", "url": "/someurl", "standard_ccp_signature_core": { "as_of": "2019-07-04T16:46:23.760Z",

我有JSON,如下所示:

[
    {
        "id": 7,
        "name": "Example 1",
        "player_class": 2,
        "player_class_name": "Class1",
        "url": "/someurl",
        "standard_ccp_signature_core": {
          "as_of": "2019-07-04T16:46:23.760Z",
          "format": 2,
          "components": [ 742, 51779, 51790, 503, 52810, 52819, 381, 49164, 48886, 56223 ]
        },
        "wild_ccp_signature_core": null
    }
]
生成的类如下所示:

[
    {
        "id": 7,
        "name": "Example 1",
        "player_class": 2,
        "player_class_name": "Class1",
        "url": "/someurl",
        "standard_ccp_signature_core": {
          "as_of": "2019-07-04T16:46:23.760Z",
          "format": 2,
          "components": [ 742, 51779, 51790, 503, 52810, 52819, 381, 49164, 48886, 56223 ]
        },
        "wild_ccp_signature_core": null
    }
]
公共类原型
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共字符串播放器\u类\u名称{get;set;}
[JsonProperty(“标准ccp签名核心”)]
公共标准CCPsignatureCore核心卡{get;set;}
}
公共类标准CCPsignatureCore
{
公共列表组件{get;set;}
}
我想稍微简化一下
原型
类,使其看起来像这样:

公共类原型
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共整数播放器_类{get;set;}
公共字符串播放器\u类\u名称{get;set;}
[JsonProperty(“标准ccp签名核心”)]
公共列表组件{get;set;}
}

使用Newtonsoft反序列化程序可以实现这一点吗?我非常确定我必须在我的
原型
类的components属性上设置
JsonObject
属性,但不确定如何告诉它如何执行此操作。

您可以使用以下转换器执行此操作:

public class ArchetypeConverter : JsonConverter
{ 
    public override bool CanConvert(Type objectType)
    {
        return typeof(Archetype).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = JObject.Load(reader);
        var token = obj.SelectToken("standard_ccp_signature_core.components");

        if (token != null)
            obj.Add(token.Parent);

        using (reader = obj.CreateReader())
        {
            existingValue = (existingValue ?? new Archetype());
            serializer.Populate(reader, existingValue);
        }
        return existingValue;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
型号:

[JsonConverter(typeof(ArchetypeConverter))]
public class Archetype
{
    public int id { get; set; }
    public string name { get; set; }
    public int player_class { get; set; }
    public string player_class_name { get; set; }
    public List<int> components { get; set; }
}
[JsonConverter(typeof(ArchetypeConverter))]
公共类原型
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共整数播放器_类{get;set;}
公共字符串播放器\u类\u名称{get;set;}
公共列表组件{get;set;}
}

您能添加一个附加属性吗?“公共列表组件{get{return core_cards.components;}set{core_cards.components=value;}}”。如果您试图避免保留/解析一个非常大的对象,那么这显然不是一个很好的解决方案。为什么不使用一个版本的转换器?为什么不。如果有必要,可以创建convert的通用版本,并指定通过属性的路径。