为啥会有 JConstructor?
Posted
技术标签:
【中文标题】为啥会有 JConstructor?【英文标题】:Why is there a JConstructor?为什么会有 JConstructor? 【发布时间】:2014-10-10 16:02:31 【问题描述】:Json.NET 定义了一个JConstructor
type。
这令人困惑,因为(据我所知)构造函数不是 JSON 的一部分。我仔细检查了JSON spec 并浏览了json.org,但找不到任何东西。网络上似乎也没有太多关于这种类型的文档。
因为 Json.NET 使用如此广泛(它甚至由 Microsoft 共同签署),我认为在对象模型中包含这种表示必须有一些合理的动机。问题是,我对确定动机的任何尝试都只是猜测。
我测试了类型及其序列化,明显的行为是只包装 javascript 代码,例如 new constructorName(...)
,例如:
new JConstructor("ctorExample",
new JValue("value"),
new JObject(
new JProperty("prop1", new JValue(1)),
new JProperty("prop2", new JValue(2)))
)
.ToString()
输出
new ctorExample(
"value",
"prop1": 1,
"prop2": 2
)
那么,JConstructor
类型打算代表什么,它为什么存在?
【问题讨论】:
【参考方案1】:Json.NET 包含许多不属于 JSON 规范的特性。特别是,它允许解析一些“官方”无效的 JSON 文件。这包括未引用的属性、cmets、构造函数等。它包括引用的序列化和许多其他功能。某些功能,例如 cmets 或未引用的属性,可以在以后成为标准的一部分。
JConstructor
允许生成供 JavaScript 应用程序使用的代码。以这种方式序列化的数据是无效的 JSON,但有效的 JavaScript 代码。此类 JSON 文件无法使用 JSON.parse
方法解析,但 eval
将能够处理它们。在某些情况下它可能有用,但可能是不好的做法,主要用于向后兼容现有的 JS 脚本,所以这可能是它没有被宣传的原因。
【讨论】:
我注意到内联构造函数在允许自定义初始化逻辑以及通过在每次有值时不重复属性名称来节省数据存储方面都有优势。如果构造函数本身完全由 JSON 的使用者控制,并且构造函数调用站点仅包含文字而不是表达式或其他函数调用,那么它可以是安全的。以上是关于为啥会有 JConstructor?的主要内容,如果未能解决你的问题,请参考以下文章
jack放序列化自定义字段绑定,报错:can only instantiate non-static inner class by using default, no-argument constru