将JSON结构解析为对象,但结构可能包含不同的名称

时间:2015-04-09 12:25:36

标签: c# json

我需要能够访问每个送货服务的代码和标题属性,但是每次包含它们的对象的名称都不同,我无法控制它。

JSON file

3 个答案:

答案 0 :(得分:2)

您可以使用Newtonsoft.Json nuget包直接将JSON对象解析为模型。

var objData = JsonConvert.DeserializeObject<MyData>(jsonString);

您可以从http://json2csharp.com/

的json数据中获取模型类

您也可以使用动态对象进行转换

var objData = JsonConvert.DeserializeObject<dynamic>(jsonString); 

或者没有指定模型calss

var objData = JsonConvert.DeserializeObject(jsonString);

答案 1 :(得分:1)

您可以使用Json.net将您的json反序列化为dynamic变量以修复(未知属性)问题,并假设您知道它们,并按名称访问您的属性。

示例:

dynamic parsedObject = JsonConvert.DeserializeObject("{\"id\":\"123\"}");
parsedObject.id // it should read 123

答案 2 :(得分:1)

以下代码与json.net一起使用。

///Custom converter to parse the container.
public class ItemConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jobj = JObject.Load(reader);

        var item = jobj.First.First.ToObject<Item>();
        var container = new ItemContainer
        {
            Name = jobj.First.Path,
            Data = item
        };
        return container;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (Item);
    }
}

[JsonConverter(typeof(ItemConverter))]
public class ItemContainer
{
    public string Name { get; set; }

    //Your object is here
    public Item Data { get; set; }
}

public class Item
{
    public string code { get; set; }
    //Other properties
}

public class RootObj
{
    public ItemContainer[] ShippingMethods { get; set; }
}

反序列化json:

JsonConvert.DeserializeObject<RootObj>("Your json string");