如何将 JSON 字符串中的名称-值集合对反序列化为对象?
How to deserialize name-value collection pairs from a JSON string into an object?
我正在尝试将 JSON 字符串反序列化为强类型 Payment
class,如下定义。 JSON 包含 items
集合中的一些名称-值对。如何将它们反序列化为 class 上的 ID
和 PersonName
属性?
我的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
to do what you want. Below is a generic one which should do the job. The converter works by first loading the JSON into a JObject
,然后将项目数组转换为 JObject
上的常规属性,最后从 JObject
填充目标 class ].
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();
}
}
您可以通过向目标 class 添加 [JsonConverter]
属性来使用转换器,如下所示:
[JsonConverter(typeof(ClassWithItemsConverter<Payment>))]
public class Payment
{
...
}
这是一个工作演示:https://dotnetfiddle.net/IuHT3O
我正在尝试将 JSON 字符串反序列化为强类型 Payment
class,如下定义。 JSON 包含 items
集合中的一些名称-值对。如何将它们反序列化为 class 上的 ID
和 PersonName
属性?
我的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
to do what you want. Below is a generic one which should do the job. The converter works by first loading the JSON into a JObject
,然后将项目数组转换为 JObject
上的常规属性,最后从 JObject
填充目标 class ].
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();
}
}
您可以通过向目标 class 添加 [JsonConverter]
属性来使用转换器,如下所示:
[JsonConverter(typeof(ClassWithItemsConverter<Payment>))]
public class Payment
{
...
}
这是一个工作演示:https://dotnetfiddle.net/IuHT3O