簡體   English   中英

如何將名稱 - 值集合對從JSON字符串反序列化為對象?

[英]How to deserialize name-value collection pairs from a JSON string into an object?

我正在嘗試將JSON字符串反序列化為強類型的Payment類,如下所述。 JSON在items集合中包含一些名稱 - 值對。 如何將這些反序列化為我的類中的IDPersonName屬性?

我的JSON:

{
  "status": 1,
  "amount": 200.0,
  "items": [
    {
      "name": "ID",
      "value": "123456"
    },
    {
      "name": "PersonName",
      "value": "test"
    }
  ]
}

我的課:

public class Payment
{
    [DataMember]
    public string Status { get; set; }

    [DataMember]
    public string Amount { get; set; }

    [DataMember]
    public string ID { get; set; }

    [DataMember]
    public string PersonName { get; set; }
}

以下是我嘗試反序列化的方法:

var response = JsonConvert.DeserializeObject<Payment>(message);

您需要使用自定義JsonConverter來執行您想要的操作。 以下是應該完成這項工作的通用工具。 轉換器首先將JSON加載到JObject ,然后將items數組轉換為JObject上的常規屬性,最后從JObject填充目標類。

public class ClassWithItemsConverter<T> : JsonConverter where T : class, new()
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(T);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        JProperty items = jo.Property("items");
        if (items != null && items.Value.Type == JTokenType.Array)
        {
            foreach (JObject item in items.Value.Children<JObject>())
            {
                jo.Add((string)item["name"], item["value"]);
            }
            items.Remove();
        }
        T result = new T();
        serializer.Populate(jo.CreateReader(), result);
        return result;
    }

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

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

您可以通過向目標類添加[JsonConverter]屬性來使用轉換器,如下所示:

[JsonConverter(typeof(ClassWithItemsConverter<Payment>))]
public class Payment
{
    ...
}

這是一個工作演示: https//dotnetfiddle.net/IuHT3O

暫無
暫無

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

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