我正在使用第三方API,因此无法更改响应结构。 作为回应,我得到这样的东西:
{
"Code": "SomeCode",
"Name": "Some Name",
"IsActive": true,
"Prop13": {
"LongId": "12",
"ShortId": "45"
},
"Prop26": {
"LongId": "12",
"ShortId": "45"
},
"Prop756": {
"LongId": "12",
"ShortId": "45"
}
}
我需要将其解析为下一个类:
public class Class1
{
public string Code { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
public Dictionary<string, PropertiesClass> Properties { get; set; }
}
public class PropertiesClass
{
public int LongId { get; set; }
public int ShortId { get; set; }
}
属性“ Prop13”,“ Prop26”等是动态响应的,可能都不存在,或者名称完全不同。因此,我必须仅将Code,Name和IsActive(始终存在)存储到类属性中,所有其他属性都应转到Dictionary。属性名称应作为键存储在字典中。
在https://www.newtonsoft.com/json/help/html/Introduction.htm中找不到任何可以帮助我的东西
答案 0 :(得分:3)
我可以想到一种方法。
您的Class1
需要稍作修改:
public class Class1
{
public string Code { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
[JsonExtensionData]
public Dictionary<string, JToken> _JTokenProperty { get; set; }
public Dictionary<string, PropertiesClass> Properties1 { get; set; } = new Dictionary<string, PropertiesClass>();
}
然后在解析对象的位置,您要像这样解析它:
var obj = JsonConvert.DeserializeObject<Class1>("{\"Code\":\"SomeCode\",\"Name\":\"Some Name\",\"IsActive\":true,\"Prop13\":{\"LongId\":\"12\",\"ShortId\":\"45\"},\"Prop26\":{\"LongId\":\"12\",\"ShortId\":\"45\"},\"Prop756\":{\"LongId\":\"12\",\"ShortId\":\"45\"}}");
foreach(KeyValuePair<string, JToken> token in obj._JTokenProperty)
{
obj.Properties1.Add(token.Key, token.Value.ToObject<PropertiesClass>());
}
这将生成所需的输出。
编辑:感谢@Nkosi提供的链接和建议,使其保持独立。
您可以将以下内容添加到Class1
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
foreach (KeyValuePair<string, JToken> token in _JTokenProperty)
{
Properties1.Add(token.Key, token.Value.ToObject<PropertiesClass>());
}
}
您的反序列化变为:
var obj = JsonConvert.DeserializeObject<Class1>("{\"Code\":\"SomeCode\",\"Name\":\"Some Name\",\"IsActive\":true,\"Prop13\":{\"LongId\":\"12\",\"ShortId\":\"45\"},\"Prop26\":{\"LongId\":\"12\",\"ShortId\":\"45\"},\"Prop756\":{\"LongId\":\"12\",\"ShortId\":\"45\"}}");