首页 > 解决方案 > 如何创建转换器以便 JsonConvert.DeserializeObject 将转换 List属性只是字符串属性

问题描述

我有以下课程...

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>属性。但是如果他无法适应,我该如何实现和使用 aJsonConverter以便JsonConvert成功地将 JSON 转换为我的目标类。假设 JSON 中的所有 List 属性都至少有一个项目(永远不会为 null 或空),并且我们想要获取第一个项目。

我知道这可以做到,但我不知道怎么做。

标签: c#asp.net-mvcjson.nettype-conversion

解决方案


这是一个适合您的转换器:

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


推荐阅读