4

首先,很抱歉再问一个关于 JSON 反序列化的问题。但是,我还没有看到这个问题的答案。

我想将 JSON 反序列化到T递归T定义为:

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

我知道那里的许多JSON库都允许指定反序列化类型,但是根据我的经验,一些自定义类型JObjectJsonObject一定深度)。这似乎很简单,因为类型几乎与 JavaScript 一对一映射。

编辑

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

同时,我正在使用 FParsec 解析器和手动序列化器。它工作得很好,但我认为可能已经有一些东西了。

4

2 回答 2

0

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

我的经验表明,System.Runtime.Serialization.Json具体可用的标准 DotNet 库DataContractJsonSerializer对于您描述的工作来说已经足够了,并且将成功地处理您提到的所有类型(没有元数据描述),而不是一种;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 执行“纯”序列化和反序列化而不使用任何代理类型对象(至少不在输出或输入中,可能在内部某处)。

于 2012-04-18T06:51:48.247 回答
-1

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

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

于 2012-04-18T07:48:11.990 回答