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

C# 使用Newtonsoft.Json将名称反序列化为值,c#,json,json.net,deserialization,C#,Json,Json.net,Deserialization,是否可以将名称反序列化为值 我有一些类似这样的JSON: { "id": "106906", "data": { "SER1": { "events": [ { "timestamp": "2020-11-11T10:28:40.728600Z", "type&qu

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

我有一些类似这样的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"
        }
      ]
    }
  }
}
// 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; } 
}

我使用的C#类如下所示:

{
  "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"
        }
      ]
    }
  }
}
// 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; } 
}

//根myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);
公开课活动
{
公共日期时间时间戳{get;set;}
公共字符串类型{get;set;}
}
公共类设备
{
公共字符串Id{get;set;}
公共列表事件{get;set;}
}
公共类数据
{
公共列表设备{get;set;}
}
公共类根
{
公共字符串id{get;set;}
公共数据数据{get;set;}
}
我希望
SER1
SER2
映射到
列表设备
,分别使用
Device
Id
获取
SER1
SER2


这可能吗?

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

首先,你需要对你的类做一个小的调整,因为你有一个额外的层在里面。JSON中没有
设备
成员——只有
数据
,表示设备列表。因此,将根类更改为:

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

    [JsonProperty("data"), JsonConverter(typeof(DeviceListConverter))]
    public List<Device> Devices { get; set; }
}
现在,您可以像往常一样进行反序列化,它应该可以按照您的意愿工作:

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

这是一个有效的演示:

不要使用
列表
,试试
字典
谢谢Franz,试过了,但运气不好。。。尝试使用字典,然后查看您获得的数据(尤其是密钥),并考虑在反序列化后可以执行哪些步骤来填充id字段;)谢谢你,布莱恩,它很有魅力!!没问题;很高兴我能帮忙!