如何解析不完全对应的json

时间:2018-11-13 10:54:56

标签: c# json json.net

我正在使用第三方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中找不到任何可以帮助我的东西

1 个答案:

答案 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>());
}

这将生成所需的输出。

enter image description here


编辑:感谢@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\"}}");