【问题标题】:Json.NET api to get JSON type from .NET typeJson.NET api 从 .NET 类型获取 JSON 类型
【发布时间】:2016-05-04 09:51:47
【问题描述】:

使用 Json.NET,有没有办法找出给定的 .NET 类型(或实际上是 MemberInfo)将被序列化为什么 JSON 类型(数组、对象、字符串、整数等)?

http://www.newtonsoft.com/json/help/html/serializationguide.htm

上面的文档给出了一个很好的主意,但是我可以使用 Json.NET 中的公共 API 吗?理想情况下,它还会考虑任何会影响序列化的自定义属性(如JsonObjectAttribute 等)

【问题讨论】:

  • 这个问题没有多大意义,因为 JavaScript 不是类型化语言。你到底需要这个做什么?了解您的用例有助于理解和回答问题
  • 这个问题与 JavaScript 无关。 JSON 有一些基本数据类型 (en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example),出于各种原因,我想知道给定的 .NET 类型将被序列化为这些类型中的哪一种(使用 Json.NET 时)
  • 基本上 JSON 表示一个 JavaScript 对象,带有 JavaScript 属性,这些属性是松散类型的(即,尽管某些东西是数字,例如,您可以将其用作字符串)。我在询问用例,因为您可能需要不同的解决方案。 JSON 有更严格的类型定义,例如json-schema.org
  • 你看到我的回答了吗?它不适合你吗?

标签: .net serialization json.net


【解决方案1】:

对于您的需要,最合适的解决方案是使用JSON schemas。 JSON.NET 支持它们:

http://www.newtonsoft.com/jsonschema

其中一项功能正是您所需要的:

生成 JSON 架构 从现有的 .NET 类型自动生成 JSON 架构。

从它的主页。

那里有are examples on its documentation.,像这样:

.NET 类型

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

生成 JSON 架构

JSchemaGenerator generator = new JSchemaGenerator();

JSchema schema = generator.Generate(typeof(Person));
// {
//   "type": "object",
//   "properties": {
//     "Name": {
//       "type": [ "string", "null" ]
//     },
//     "Age": { "type": "integer" }
//   },
//   "required": [ "Name", "Age" ]
// }

关于许可证的说明

当我写答案时,我没有意识到您需要商业使用许可证。 This is the license link,包含在 OP 的评论中,@Oskar。

关于实施自定义解决方案的注意事项

自己实现非常复杂,因为生成的 JSON 依赖于 JSON.NET 配置,其中可以包括从简单的属性到自定义(反)序列化器以及其他几种配置。因此,“预测” JSON.NET 将生成什么 JSON 真的很难。最简单的方法是:

  • 实例化一个示例 .NET 对象
  • 序列化
  • 并分析生成的 JSON

这样做非常困难,既要实例化一个有效的示例 .NET 对象,又要分析生成的 JSON。为了使最后一步更容易,您可以从 JSON 中创建一个 .NET 对象,并使用反射对其进行分析。并缓存这些分析的结果以避免过多使用反射,这很慢。

很遗憾,Visual Studio 中还没有 JavaScript 语言服务,而是 it will be available in the next release。这将使分析生成的 Javascript 对象变得更加容易。请记住,JSON 是一个文字 JavaScript 对象,可以很容易地实例化,但在 JavaScript 域中。

【讨论】:

  • 谢谢,这看起来很有希望,但不幸的是它不是免费的(至少用于商业用途,newtonsoft.com/store/jsonschema)所以我还没有检查过
猜你喜欢
  • 2020-10-25
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多