繁体   English   中英

使用 Newtonsoft.Json 将名称反序列化为值

[英]Deserialize a name as a value using Newtonsoft.Json

是否可以将名称反序列化为值?

我有一些 JSON 像这样:

{
  "id": "106906",
  "data": {
    "SER1": {
      "events": [
        {
          "timestamp": "2020-11-11T10:28:40.728600Z",
          "type": "high"
        }
      ]
    },
    "SER2": {
      "events": [
        {
          "timestamp": "2020-11-11T10:28:40.728600Z",
          "type": "high"
        }
      ]
    }
  }
}

我正在使用的 C# 类是这样的:

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 

public class Event    
{
    public DateTime timestamp { get; set; } 
    public string type { get; set; } 
}

public class Device    
{
    public string Id { get; set; } 
    public List<Event> events { get; set; } 
}

public class Data    
{
    public List<Device> Devices { get; set; } 
}

public class Root
{
    public string id { get; set; } 
    public Data data { get; set; } 
}

我希望SER1SER2到 map 到List<Device> Devices Device设备的Id分别获得SER1SER2

这可能吗?

是的,这可以做到,但您需要一个自定义的JsonConverter来处理它。

首先,你需要对你的类做一个小的调整,因为你有一个额外的层。 JSON 中没有devices成员——只有data ,它代表设备列表。 因此,将您的根 class 更改为:

public class Root
{
    public string Id { get; set; }

    [JsonProperty("data"), JsonConverter(typeof(DeviceListConverter))]
    public List<Device> Devices { get; set; }
}

您也可以删除Data class,因为它不是必需的。

这是自定义DeviceListConverter class 所需的代码:

public class DeviceListConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<Device>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);
        return obj.Properties()
                  .Select(jp => new Device
                  {
                      Id = jp.Name,
                      Events = jp.Value["events"].ToObject<List<Event>>(serializer)
                  })
                  .ToList();
    }

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

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

现在您可以像往常一样反序列化,它应该可以按您的意愿工作:

var root = JsonConvert.DeserializeObject<Root>(json);

这是一个工作演示: https://dotnetfiddle.net/qORiPG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM