c# - 如何将名称-值集合对从 JSON 字符串反序列化为对象?

标签 c# c#-4.0 json.net

我正在尝试将 JSON 字符串反序列化为强类型 Payment 类,如下定义。 JSON 在 items 集合中包含一些名称-值对。我如何将它们反序列化为我类的 IDPersonName 属性?

我的 JSON:

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

我的类(class):

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 中。 ,然后将项目数组转换为 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

关于c# - 如何将名称-值集合对从 JSON 字符串反序列化为对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161802/

相关文章:

c# - ASP .NET CORE 简单的参数验证

c# - 是否有任何常用的 IQueryable 实现?

Json.NET 获取嵌套的 jToken 值

c# - Umbraco 检查节点是否仍然存在

c# - 静态方法在 Web 开发中是否安全?

c# - Unity PHP Post 不发送 POST 变量

javascript - 使用 AJAX 发送到 MVC 中的 Controller 时,嵌套的 javascript 对象属性为 null

c# - 使用 BookSleeve 移除 SortedSet

c# - JSON.Net 错误地将二维数组序列化为一维

c# - JSON.NET 将接口(interface)反序列化为属性名称