Как десериализовать пары коллекции имя-значение из строки JSON в объект? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь десериализовать строку JSON в строго типизированный класс Payment, как определено ниже. JSON содержит несколько пар имя-значение в коллекции items. Как я могу десериализовать их в свойства ID и PersonName моего класса?

Мой 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);

1 Ответ

0 голосов
/ 06 ноября 2018

Вам нужно будет использовать пользовательский JsonConverter, чтобы делать то, что вы хотите. Ниже приведен общий, который должен делать эту работу. Преобразователь работает, сначала загружая JSON в JObject, затем преобразовывая массив элементов в обычные свойства в 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

...