【问题标题】:How Do I Configure Json.NET Custom Serialization?如何配置 Json.NET 自定义序列化?
【发布时间】:2011-09-28 15:26:25
【问题描述】:

由于我无法控制的原因,我从外部服务返回的数据被格式化为字符串数组:[["string_one", "string_two"]]

我正在尝试将其反序列化为具有两个属性的对象:

public class MyObject
{
    public string PropertyOne { get; set; }
    public string PropertyTwo { get; set; }
}

我将 Json.NET 用于所有 JSON 序列化/反序列化。当我尝试转换字符串数组的数组时,我收到一个异常说 JsonArray 无法转换为 MyObject。实现这一点的适当方法是什么?

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    您的目标对象和 JSON 之间存在很大差异。您可以手动进行映射:

    string json = "[[\"string_one\", \"string_two\"]]";
    dynamic result = JsonConvert.DeserializeObject(json);
    var myObject = new MyObject
    {
        PropertyOne = result[0][0],
        PropertyTwo = result[0][1]
    };
    

    【讨论】:

    • 遗憾的是,这种差异是不可避免的。
    【解决方案2】:

    最终使用 JsonConverter 实现了这一点。我将 MyObject 更改为:

    [JsonConverter(typeof(MyObjectConverter))]
    public class MyObject
    {
        public string PropertyOne { get; set; }
        public string PropertyTwo { get; set; }
    }
    

    然后实现MyObjectConverter:

    public class MyObjectConverter : JsonConverter
    {
        public override object ReadJson (JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
        {
            int pos = 0;
            string[] objectIdParts = new string[2];
    
            while (reader.Read())
            {
                if (pos < 1)
                {
                    if (reader.TokenType == JsonToken.String)
                    {
                        objectIdParts[pos] = reader.Value.ToString();
                        pos++;
                    }
                }
                // read until the end of the JsonReader
            }
    
            return new MyObject(objectIdParts);
        }
    
        public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException ();
        }
    
        public override bool CanWrite {
            get {
                return base.CanWrite;
            }
        }
    
        public override bool CanRead { get { return true; } }
        public override bool CanConvert (Type objectType) 
        {
            return true;
        }
    }
    

    【讨论】:

      【解决方案3】:

      老实说,我只是将其反序列化为 string[][] 并将其映射到您的域层中。您花在自定义序列化上的时间很少值得。

      【讨论】:

      • 我不喜欢这样的答案 b/c 它对有这个普遍问题的人没有帮助,他们将来会阅读这个答案......
      • @Henley - 幸运的是,有不止一个答案可供选择;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多