json模式到目标c - 模型类生成

Posted

技术标签:

【中文标题】json模式到目标c - 模型类生成【英文标题】:json schema to objective c - model classes generation 【发布时间】:2011-07-14 08:15:51 【问题描述】:

你好堆栈溢出人

我正在编写一个通过带有 JSON 的 REST 连接到 Web 服务的 iphone 应用程序。 我想从我的 Web 服务提供的 json 模式生成目标 c 中的模型类,有点像我对 wsdl2objc 和 asoap、xml 和 wsdl 组合所做的那样。

似乎没有太多关于这个主题的内容

我尝试了来自 http://code.google.com/p/bkjsonschema/ 的名为 jsonschema2objc.rb 的东西,但即使在最简单的 json 模式上,它也会给我错误,这里可以找到:http://en.wikipedia.org/wiki/JSON#Schema

我收到此错误: 使用临时文件 /var/folders/rN/rNw33pkyHVeNG+-IesdU+k+++TI/-Tmp-/jsonschema2objc.8WRkBSQo !!!索引 Product 处的对象定义类型未知

所以这是我的两个问题:

你们知道任何实现 jsonchema => 目标 c 类的好工具吗? 你知道这个错误在我的 ./jsonschema2objc.rb 中意味着什么

谢谢!

【问题讨论】:

【参考方案1】:

Mac Appstore 中有一个非常棒的工具,名为 JSONModeler(现在它已停产),但同样的人制作了 JSON Accelerator,这是同一程序的演变。它真的很好(而且便宜),它可以生成 Objective-C、Java 和 Python 代码(JSONModeler 还支持 Coredata 类和模式,不过我不知道他们在新版本中是否仍然支持它)。

【讨论】:

当最上面的字段是字典数组时,JSON 加速器会产生错误的代码。例如, "levels" : [ "pieces" : [...] ] Levels 类在与 "levels" 相同的深度处查找名为 "pieces" 的字典键。此外,我宁愿看到一个 Level 类,它是从 Levels 的复数形式推导出来的,它是一个数组。应该有另一个最顶层的类,它有一个名为 levels 的成员变量,它是一个 Level 对象的数组。【参考方案2】:

我是 jsonschema2objc 的开发者,它依赖于 JSON 模式的超集。也就是说,我们需要调整一点 JSON 模式来添加额外的属性来指定 JSON 和 Obj-C 之间的映射。例如,您可以在 JSON 和生成的 Obj-C 类中指定不同的属性名称。我们已经需要添加生成的解析代码所需的类型转换器和类型解析器的概念,例如将原始字符串转换为日期 (NSDate) 对象或解析已解析对象的实际子类。我们支持包含作为给定类的子类的对象的一对多关系。在运行时,我们将使用架构中提供的其他元数据来确定要实例化哪个类。

我意识到我们在没有任何示例模式的情况下将这个脚本放在那里,以便更好地了解如何使用它。我会在接下来的几天内解决这个问题...

同时,我建议您使用项目附带的 TextMate 包。我们支持数十个 TextMate sn-ps,可自动创建有效架构。

【讨论】:

嘿弗朗索瓦!从 twitter 到堆栈溢出,这很有趣;)现在的问题是,如何使用 TextMate 包,不确定它是如何工作的......我需要从 web 服务上的 java 类生成 json 模式,是工具能做到吗??【参考方案3】:

它不是免费的,但也许Objectify 会做你想做的事?看起来很流畅。

【讨论】:

刚刚测试过了。考虑到它是 5 美元,这比这个价格还值。 似乎不再可用 很伤心,帮了我很多,但现在不在 El Capitain 工作。【参考方案4】:

https://github.com/BrunoAlexandreMendesMartins/CleverModels

给定一个特定的 URL,CleverModels 会为您发出请求并根据 JSON 响应生成模型。

这是一个新工具和开源。

目标是支持多种语言。

【讨论】:

【参考方案5】:

你可以试试json2objc。我的一个朋友为自己开发了这个,在我坚持之后,他把它变成了公共服务。这不是商业的。

【讨论】:

【参考方案6】:

查看Nidyx!它支持 JSON Schema 到 Obj-C 模型(以 CLI 的形式,而不是网站的形式),它可以输出符合 JSONModel 的类,它支持 Swift 并且可能即将推出 Java!

【讨论】:

【参考方案7】:

我喜欢使用ESJsonFormat。 这让我可以将我的 JSON 粘贴到一个文本框中,然后插件会创建类。

E:从 xcode 8 开始,插件不是“官方支持”的。 See here

【讨论】:

【参考方案8】:

有一个名为“JSON Class Generator”的工具可以“从您在此编辑器中定义的类和枚举生成 Objective-C 源代码”。你也可以find it in the Mac App Store.

它没有 jsonschema 的导入功能,但会根据您在 gui 中定义的内容生成非常完整的模型。

也许您可以选择在编辑器中重新输入所有模型。如果你去图书馆,你肯定有更多的工作要做。使用该应用程序,您可以从代码生成中获得所需的好处。 (我个人的原因是:更少的工作,更不容易出错,更少的运行时检查,更容易修改,生成代码的更多功能)。

该应用程序是免费的。

由于不直接支持 json 模式:可能存在创建转换器的选项。我检查了上述应用程序的文档文件格式。它也是 JSON,看起来很简单(有点类似于 json 模式)。所以转换器在一定程度上是可能的。但我担心,问题出在细节上——就像经常发生的那样——“我一天写一个转换器”变成了“我正在写一个转换器,到目前为止我花了 2 周时间,但我还没有完成”。这将是一个很酷的开源项目......

【讨论】:

【参考方案9】:

如果你找不到第三方工具,你可以接近下面的想法。

JSON 给你一个类似于加载 plist 的字典? 您可以实现包含字典并覆盖 NSObject 的两个方法的包装类:

   -(BOOL) respondsToSelector:(SEL)selector
   -(id) performSelector:(SEL)selector

如果选择器的名称在字典中,它会响应选择器,并在执行选择器时返回对象,如果该对象是字典,它将将该字典包装在包装器类中并返回。

现在这不会让您获得良好的类型信息,但您可以像这样深入字典:

NSValue *universalGravity = (NSValue*) [[[jsonResponds settings] universal] gravity];

只是我在阅读您的问题时的一个想法,并认为如果您找不到一些已经实现您正在寻找的第三方,它可能是一个快速、足够好的解决方案。

【讨论】:

问题是,我想使用 RestKit api 将我的 json 响应从 web 服务映射到我在 obj c 中的本地模型对象,这就是为什么我需要生成那些 .h 和 .m来自 json 架构的文件 啊。好的,认为对变量的编码访问更容易。【参考方案10】:

预先编写模型代码并不是最灵活的解决方案。您可以拥有聪明的模型,尝试将传入的 JSON 转换为您定义的属性。看看 JSONModel Obj-C 框架。

它包含大量演示和测试,用它编写模型非常容易:

https://github.com/icanzilb/JSONModel

【讨论】:

“预写模型代码不是最灵活的解决方案” => 为什么? 在“预写”与“在运行时检测输入”中不灵活【参考方案11】:

您好,您可以使用此工具将 json 转换为 obj c 对象。

http://www.realmgenerator.eu/

【讨论】:

【参考方案12】:

您可以使用以下链接:

Convertor Link - 此实用程序生成一个兼容 Swift 2.0 的模型,可以在您的项目中轻松拖动和使用

【讨论】:

以上是关于json模式到目标c - 模型类生成的主要内容,如果未能解决你的问题,请参考以下文章

如何在目标 c 数据模型类中使用 Codable 协议?

自动从数据库生成实体模型到当前的DbContext类

如何从 XML 模式生成 Objective C 类文件?

rational rose怎么生成代码

如何在 xcode (swift) 中从 Json Schema / Json 生成模型对象?

如何从codeigniter中的模型生成json格式到Highchart