【问题标题】:NewtonSoft Json deserialization property list as array of objectsNewtonSoft Json 反序列化属性列表作为对象数组
【发布时间】:2018-07-18 16:37:02
【问题描述】:

我有一个奇怪的 Json 结果集,它有一个重复(但可变)的属性,我需要将其转换为对象类型的数组,例如

"result": {
    "documents": {
        "abcd": {
            "propertyX": 0
            "propertyY": "A"
        },
        "efgh": {
            "propertyX": 5
            "propertyY": "B"
        },
        "ijkl": {
            "propertyX": 2
            "propertyY": "C"
        }
    }
}

我想做的是让我的 Result 对象带有一个文档属性,并且它有一个“项目”数组。每个项目对象将包含“propertyX”、“propertyY”等。不幸的是,“abcd”、“efgh”等是项目的随机列表,但它们被呈现为不同的属性。

是否有一种直接的方法来处理这个问题,或者我需要一个自定义转换器?

【问题讨论】:

标签: .net json.net


【解决方案1】:

是的,处理此问题的直接方法是为您的documents 属性使用Dictionary<string, Item>。随机的文档名称将成为字典的键。您可以像这样声明类:

class RootObject
{
    public Result Result { get; set; }
}

class Result
{
    public Dictionary<string, Item> Documents { get; set; }
}

class Item
{
    public string PropertyX { get; set; }
    public string PropertyY { get; set; }
}

然后像这样反序列化 JSON:

RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

小提琴:https://dotnetfiddle.net/lTDGj3


如果你不想在你的类中使用字典,而是真的希望有一个项目数组(或列表),那么是的,你需要一个转换器。在这种情况下,你可以像这样声明你的类:

class RootObject
{
    public Result Result { get; set; }
}

class Result
{
    [JsonConverter(typeof(DocumentListConverter))]
    public List<Item> Documents { get; set; }
}

class Item
{
    public string Name { get; set; }
    public string PropertyX { get; set; }
    public string PropertyY { get; set; }
}

文档列表的自定义转换器类如下所示:

class DocumentListConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<Item>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        List<Item> items = new List<Item>();
        foreach (JProperty prop in jo.Properties())
        {
            Item item = prop.Value.ToObject<Item>();
            item.Name = prop.Name;
            items.Add(item);
        }
        return items;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

你会像以前一样反序列化:

RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

小提琴:https://dotnetfiddle.net/xWRMGP

【讨论】:

  • 简单就是伟大;非常感谢您提供两种选择
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多