Как создать конвертер, чтобы JsonConvert.DeserializeObject преобразовывал свойства List <string>в строковые свойства - PullRequest
1 голос
/ 27 сентября 2019

У меня есть следующий класс ...

public class ResultDTO
{
    public string MSAccountNumber { get; set; }
    public string MSCaseNumber { get; set; }
    public string StatusMessage { get; set; }
    public string StatCode { get; set; }
}

Неудивительно, что JsonConvert.DeserializeObject не может преобразовать следующий JSON в этот объект ....

    {
      "StatusMessage": [
        "Record processed successfully"
      ],
      "StatCode": [
        "200"
      ],
      "MSCaseNumber": [
        "500"
      ],
      "MSAccountNumber": [
        "001"
      ]
    }

У меня естьспросил создателя API, может ли он изменить API, чтобы возвращаемый JSON имел строковые свойства вместо List<string> свойств.Но в случае, если он не может это учесть, как мне реализовать и использовать JsonConverter, чтобы JsonConvert успешно преобразовал этот JSON в мой целевой класс.Предположим, что все свойства List в JSON будут иметь хотя бы один элемент (никогда не будет пустым или пустым), и мы хотим взять первый элемент.

Я знаю, что это можно сделать, но я понятия не имею, как.

1 Ответ

1 голос
/ 27 сентября 2019

Вот конвертер, который должен работать для вас:

class StringArrayToStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null) return null;
        if (reader.TokenType == JsonToken.String) return (string)reader.Value;
        if (reader.TokenType == JsonToken.StartArray)
        {
            JArray array = JArray.Load(reader);
            string value = (string)array.Children<JValue>().FirstOrDefault();
            return value;
        }
        throw new JsonException("Unexpected token type: " + reader.TokenType);
    }

    public override bool CanWrite => false;

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

Используйте его так:

var dto = JsonConvert.DeserializeObject<ResultDTO>(json, new StringArrayToStringConverter());

Рабочая демонстрация: https://dotnetfiddle.net/kLbn2P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...