如果您使用的是.NET Core 3及更高版本,则可以从System.Text.Json.Serialization开始使用JsonExtensionDataAttribute
.
您应该添加一个新属性来接收额外的JSON元素,即Dictionary<string, JsonElement>
.
词典的TKey值必须是字符串,并且TValue必须是JsonElement或Object.
并通过一些数据转换将其分配给Devices
属性.
using System.Text.Json.Serialization;
using System.Linq;
public class RootObject
{
[JsonPropertyName("meta_data")]
public Metadata Metadata { get; set; }
[JsonExtensionData]
public Dictionary<string, JsonElement> Extension { get; set; }
[JsonIgnore]
public Dictionary<Guid, DeviceInfo> Devices
{
get
{
if (Extension == null)
return null;
return Extension.ToDictionary(x => Guid.Parse(x.Key), v => JsonSerializer.Deserialize<DeviceInfo>(JsonSerializer.Serialize(v.Value)));
}
}
}
public class DeviceInfo
{
[JsonPropertyName("ipadd")]
public string IpAdd { get; set; }
[JsonPropertyName("host")]
public string Host { get; set; }
}
如果您使用Newtonsoft.Json作为API/MVC应用程序中的默认序列化库/工具:
services.AddControllers()
.AddNewtonsoftJson();
您需要使用从Newtonsoft.Json开始的属性/反序列化方法.
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class RootObject
{
[JsonProperty("meta_data")]
public Metadata Metadata { get; set; }
[JsonExtensionData]
public Dictionary<string, JToken> Extension { get; set; }
[JsonIgnore]
public Dictionary<Guid, DeviceInfo> Devices
{
get
{
if (Extension == null)
return null;
return Extension.ToDictionary(x => Guid.Parse(x.Key),
v => JObject.FromObject(v.Value)
.ToObject<DeviceInfo>());
}
}
}
public class DeviceInfo
{
[JsonProperty("ipadd")]
public string IpAdd { get; set; }
public string Host { get; set; }
}