C#JSONConverter自定义序列化
我从一个具有动态属性的API接收JSON 我采用了一种定制的JsonConverter方法。有没有更简单的方法来处理这个问题 以下是返回的JSON:C#JSONConverter自定义序列化,c#,json,C#,Json,我从一个具有动态属性的API接收JSON 我采用了一种定制的JsonConverter方法。有没有更简单的方法来处理这个问题 以下是返回的JSON: { "kind": "tm:ltm:pool:poolstats", "generation": 1, "selfLink": "https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/stats?ver=12.1.2", "entries": {
{
"kind": "tm:ltm:pool:poolstats",
"generation": 1,
"selfLink": "https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/stats?ver=12.1.2",
"entries": {
"https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/~Common~test-mypoolname_https_main/stats": {
"nestedStats": {
"kind": "tm:ltm:pool:poolstats",
"selfLink": "https://localhost/mgmt/tm/ltm/pool/test-mypoolname_https_main/~Common~test-mypoolname_https_main/stats?ver=12.1.2"
}
}
}
}
“条目”:{”https://...“}
是根据我从API请求的内容而不断变化的部分
下面是保存此信息的类结构:
public partial class PoolStatistics
{
[JsonProperty("entries")]
public EntriesWrapper Entries { get; set; }
[JsonProperty("generation")]
public long Generation { get; set; }
[JsonProperty("kind")]
public string Kind { get; set; }
[JsonProperty("selfLink")]
public string SelfLink { get; set; }
[JsonConverter(typeof(PoolEntriesConverter))]
public partial class EntriesWrapper
{
public string Name { get; set; }
[JsonProperty("nestedStats")]
public NestedStats NestedStats { get; set; }
}
public partial class NestedStats
{
[JsonProperty("kind")]
public string Kind { get; set; }
[JsonProperty("selfLink")]
public string SelfLink { get; set; }
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
NestedStats nestedStats = (jo.First.First[NESTED_STATS]).ToObject<NestedStats>();
EntriesWrapper entries = new EntriesWrapper
{
NestedStats = nestedStats,
Name = jo.First.Path
};
return entries;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
EntriesWrapper entries = (EntriesWrapper)value;
JObject jo = new JObject(
new JProperty(NESTED_STATS, entries.NestedStats),
new JProperty(entries.Name, entries.Name));
}
通过PoolEntriesConverter
上的以下命令重写以反序列化:
public partial class PoolStatistics
{
[JsonProperty("entries")]
public EntriesWrapper Entries { get; set; }
[JsonProperty("generation")]
public long Generation { get; set; }
[JsonProperty("kind")]
public string Kind { get; set; }
[JsonProperty("selfLink")]
public string SelfLink { get; set; }
[JsonConverter(typeof(PoolEntriesConverter))]
public partial class EntriesWrapper
{
public string Name { get; set; }
[JsonProperty("nestedStats")]
public NestedStats NestedStats { get; set; }
}
public partial class NestedStats
{
[JsonProperty("kind")]
public string Kind { get; set; }
[JsonProperty("selfLink")]
public string SelfLink { get; set; }
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
NestedStats nestedStats = (jo.First.First[NESTED_STATS]).ToObject<NestedStats>();
EntriesWrapper entries = new EntriesWrapper
{
NestedStats = nestedStats,
Name = jo.First.Path
};
return entries;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
EntriesWrapper entries = (EntriesWrapper)value;
JObject jo = new JObject(
new JProperty(NESTED_STATS, entries.NestedStats),
new JProperty(entries.Name, entries.Name));
}
错误状态为:
System.ArgumentException:'无法确定的JSON对象类型
键入F5IntegrationLib.Models.Pools.PoolStatistics+NestedStats。”
如果你声明一个模式,比如
public class NestedStats
{
public string kind { get; set; }
public string selfLink { get; set; }
}
public class Entry
{
public NestedStats NestedStats { get; set; }
}
public class Root
{
public string kind { get; set; }
public int generation { get; set; }
public string selfLink { get; set; }
public Dictionary<string, Entry> entries { get; set; }
}
公共类NestedStats
{
公共字符串种类{get;set;}
公共字符串自链接{get;set;}
}
公开课入学
{
公共NestedStats NestedStats{get;set;}
}
公共类根
{
公共字符串种类{get;set;}
公共整数生成{get;set;}
公共字符串自链接{get;set;}
公共词典条目{get;set;}
}
然后可以反序列化为
var obj = JsonConvert.DeserializeObject<Root>(json);
var obj=JsonConvert.DeserializeObject(json);