将Json反序列化为适当的类型

时间:2016-12-08 17:33:01

标签: c# json datetime serialization deserialization

我正在动态反序列化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);

但它总是只转换&#34; dateTimeObject&#34;到一个字符串。我被告知反序列化Json可以做这个转换,但我无法弄清楚如何。我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

您需要使用JsonConverter来覆盖类型(de)序列化的方式。

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") );
    }
}