gpt4 book ai didi

c# - 如何将 JSON 反序列化为仅 "built-in"类型

转载 作者:行者123 更新时间:2023-11-30 13:06:33 25 4
gpt4 key购买 nike

首先,我很抱歉再问一个关于 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 中可用的标准 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 在不使用任何代理类型对象的情况下执行“纯”序列化和反序列化(至少不在输出或输入中,可能在内部某处)。

关于c# - 如何将 JSON 反序列化为仅 "built-in"类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com