C# 使用Newtonsoft简化对象的反序列化
我有JSON,如下所示: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",
[
{
"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的通用版本,并指定通过属性的路径。