JSON序列化专有对象中的键和值列表



我正在努力将一个列表更改为钥匙和值的形式。

例如:我有一个列表属性对象

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,因为其缺失的" {"one_answers"}"两端。

您可以在序列化之前使用自定义JSON转换器和包装匿名类型实现上述格式。例如,

考虑以下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中的"详细信息"键包裹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"
    }
  ]
}

相关内容

  • 没有找到相关文章

最新更新