簡體   English   中英

NewtonSoft Json反序列化屬性列表作為對象數組

[英]NewtonSoft Json deserialization property list as array of objects

我有一個奇怪的Json結果集,它具有重復(但可更改)的屬性,我需要將其轉換為對象類型的數組,例如

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

我想要做的是讓我的Result對象具有document屬性,並且它有一個“items”數組。 每個項目對象將包含“propertyX”,“propertyY”等。不幸的是,“abcd”,“efgh”等是項目的隨機列表,但它們被呈現為不同的屬性。

有沒有直接的方法來處理這個或我需要一個自定義轉換器?

是的,處理此問題的直接方法是使用Dictionary<string, Item>作為documents屬性。 隨機文檔名稱將成為字典的鍵。 您可以聲明這樣的類:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM