如何将JSON反序列化为“内置”类型

时间:2012-04-17 22:22:23

标签: c# json deserialization

首先,我所以很遗憾地提出另一个关于JSON反序列化的问题。但是,我没有看到答案。

我想将JSON反序列化为T,其中T以递归方式定义:

  • Dictionary<string, T>
  • T[]
  • string
  • 原始类型
  • (object)T(盒装)

我知道许多JSON库允许指定反序列化类型,但是根据我的经验,一些自定义类型(JObjectJsonObject,无论如何)出现在对象图中的某个位置(也就是说,返回类型似乎只适用于某个深度)。这似乎很简单,因为类型几乎与JavaScript一对一映射。

修改

理想情况下,我希望JSON“干净”,即没有特殊字段(“__type”等)来帮助反序列化。它应该是JavaScript的直接映射:JObject - &gt; IDictionary<string, T>JArray - &gt; T[],等等。

与此同时,我正在使用FParsec解析器和手动卷序器。它效果很好,但我认为可能已经有了这方面的东西。

2 个答案:

答案 0 :(得分:0)

我不太确定你的意思是“我想将JSON反序列化为T,其中T是递归定义的”我的假设是你希望能够序列化和反序列化任何类型上面列出的和任何组合。

我的经验表明,System.Runtime.Serialization.Json具体DataContractJsonSerializer中提供的标准DotNet库更适合您描述的工作,并且能成功处理您提到的所有类型(没有元数据描述) )除了一个; T的盒装对象。但是我的假设是没有库可以处理T的盒装对象而不提供元数据(它怎么能?它对你的对象一无所知)

以下是我用于在我的应用中提供序列化的一些代码

public class JSONSerializer<T>
{

    public static string Serialize(T obj)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream()) {
            serializer.WriteObject(stream, obj);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    public static T Deserialize(string json)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json))) {
            return (T)serializer.ReadObject(stream);
        }
    }

}

PS:另请注意,DataContractSerializer在不使用任何代理类型对象的情况下执行“纯”序列化和反序列化(至少不在输出或输入中,可能在内部某处)。

答案 1 :(得分:-1)

您不能使用通用。这是因为泛型必须在编译时被剥离为一种类型。但JSON对象或数组值应该是任何JSON类型,这是相互矛盾的。

但如果你想要,你可以使用object然后再施展它。 JSON数组是object[],JSON对象是Dictionary<string,object>。但这只是您提到的自定义类型的变体。