繁体   English   中英

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

[英]How to deserialize JSON to only “built-in” types

首先,我抱歉要问JSON反序列化的另一个问题。 但是,我还没有找到答案。

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

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

我知道那里有许多JSON库都允许指定反序列化类型,但是以我的经验,一些自定义类型( JObjectJsonObject等等)会出现在对象图中的某个位置(也就是说,返回类型似乎只适用了)到一定深度)。 由于类型与JavaScript几乎一对一地映射,因此似乎很简单。

编辑

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

同时,我正在使用FParsec解析器和手动滚动序列化器。 效果很好,但我认为可能已经有一些解决方案了。

我不太确定“我想将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无需使用任何代理类型对象(至少不在输出或输入中,可能不在内部)进行“纯”序列化和反序列化。

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

但是,如果您愿意,可以使用object然后进行转换。 JSON数组是object[] ,JSON对象是Dictionary<string,object> 但这只是您提到的自定义类型的变体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM