【问题标题】:Deserializing Json into Appropriate Types将 Json 反序列化为适当的类型
【发布时间】:2016-12-08 17:33:01
【问题描述】:

我正在动态反序列化 Json 字符串,我想让它们在反序列化时转换为适当的类型,但由于它是动态的,我不一定知道它们会变成什么。例如,我可能有一个如下所示的 Json:

string serializedJsonString = { 
                                 "stringValue": "someString",
                                 "dateTimeObject": "2016-12-08" 
                              };

我希望将这个 Json 反序列化为它们的键值对,但它们的值存储为相应的对象类型,在上面的示例中为 StringDateTime

我尝试了以下一些方法:

IDictionary<string, object> blah = new JavaScriptSerializer().Deserialize<IDictionary<string, object>>(serializedJsonString);

还有:

dynamic blah = Json.Decode(serializedJsonString);

但它总是只是将“dateTimeObject”转换为字符串。有人告诉我反序列化 Json 可以进行这种转换,但我不知道怎么做。我做错了什么?

【问题讨论】:

    标签: c# json datetime serialization deserialization


    【解决方案1】:

    另请阅读my previous answers 之一。它解释了如何处理关于 JSON 的字典键值对。

    然后是 DateTime 部分:JSON 中的 DateTimes 很难。

    问题来自 JSON 规范本身:JSON 中的日期没有文字语法。该规范包含对象、数组、字符串、整数和浮点数,但它没有为日期的外观定义标准。

    由于 JSON 中的日期没有标准,与其他系统互操作时可能的不同格式的数量是无穷无尽的。

    您需要使用 JsonConverter 来覆盖类型是(反)序列化的。

    public class MyDateTimeConvertor : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return DateTime.Parse(reader.Value.ToString());
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue( ((DateTime)value).ToString("dd/MM/yyyy") );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多