[英]Json Serialization/Contract Resolvers - Need to serialize object so contained list of key value pairs is converted to name value pairs at same level
[英]JSON Serialization Proprty object into Key and Value list
我正在努力將一個列表更改為“鍵和值”形式。
例如:我有一個列表屬性對象
public List<Details> Details{get;set;}
public class Details
{
public string FirstName{get;set;}
public string LastName{get;set;}
}
我正在使用以下格式的此對象尋找JSON字符串:
{"Details":[
{"Key":"FirstName" ,"Value":"value in list object"},
{"Key":"LastName" ,"Value":"value in list object"}
]}
我無法使用JSON序列化來實現。 有什么方法可以使用任何類型的可用序列化來實現它嗎?
預先謝謝你們。
首先,給定的輸出樣本並不是有效的Json,因為其兩端都缺少“ {”和“}”。
您可以在序列化之前使用Custom Json Converter和包裝的Anonymous類型實現上述格式。 例如,
考慮以下JsonConverter。
public class KeysJsonConverter : JsonConverter
{
private readonly Type[] _types;
public KeysJsonConverter(params Type[] types)
{
_types = types;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken token = JToken.FromObject(value);
if(token.Type == JTokenType.Object)
{
JObject oldValue = (JObject)token;
JObject newValue = new JObject();
var jkey = oldValue.Properties().Select(x=>x.Name).First();
var jvalue = oldValue.Properties().Select(x=>x.Value).First();
newValue.AddFirst(new JProperty("Key",jkey));
newValue.Add(new JProperty("Value",jvalue));
newValue.WriteTo(writer);
}
return;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
}
您現在可以使用以下方法序列化集合。
var result = JsonConvert.SerializeObject(details,
Newtonsoft.Json.Formatting.Indented,
new KeysJsonConverter(typeof(Details)));
這將產生如下輸出。
[
{
"Key": "FirstName",
"Value": "Anu"
},
{
"Key": "FirstName",
"Value": "Jia"
}
]
為了像在OP中那樣用“ Details”鍵包裝Json,可以將集合包裝在匿名類型中。 例如,
var result = JsonConvert.SerializeObject(new {Details=details},
Newtonsoft.Json.Formatting.Indented,
new KeysJsonConverter(typeof(Details)));
輸出樣本
{
"Details": [
{
"Key": "FirstName",
"Value": "Anu"
},
{
"Key": "FirstName",
"Value": "Jia"
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.