【问题标题】:JSON Serialization Proprty object into Key and Value list将 JSON 序列化属性对象转换为键和值列表
【发布时间】:2019-07-09 19:04:21
【问题描述】:

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

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

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 serialization json.net deserialization jobjectformatter


    【解决方案1】:

    首先,给出的输出样本并不是一个有效的 Json,因为它在两端都缺少“{”和“}”。

    您可以在序列化之前使用自定义 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"
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      相关资源
      最近更新 更多