nsjsonserialization对普通旧对象?
许多现代编程语言都有JSON库,这些库支持编码和解码JSON to/from从“普通旧对象” - IE类实例的类实例(主要具有数据属性)(属性可以是可以琐碎的/编码的类型,也可以是其他普通的类型旧对象)。示例包括Google的GSON,Golang的编码/JSON
等。
有类似于Objective-C的东西吗?
我知道可以枚举Objective-C类的属性,而且似乎有人会使用该功能来创建JSON“ Bean Mapper”,但是Google搜索对我没有任何结果,除了
*)基本上是理由是,不需要编写大量的样板(其示例实现为36 LOC,可以解析3属性)并不是一个重大改进,并且构建了几个可选的回调以允许数据验证。我显然不同意所有这些。
A lot of modern programming languages have JSON libraries that support encoding and decoding json to/from "plain old objects" - i.e. instances of classes that primarily just have data properties (properties can either be types that can be trivially de/encoded or other plain old objects). Examples include Google's GSON, golang's encoding/json
and others.
Is there something similar to Objective-C?
I know that it is possible to enumerate properties for Objective-C classes, and it seems reasonable that someone would have used that capability to create a JSON "bean mapper", but Google searching yielded no results for me, except this blog post on Apple's Swift website showing how to manually deserialize JSON to "model objects" and why they think that doing this automatically (DRYing the code) is a bad idea (*).
*) The reasoning is basically, that not needing to write a lot of boilerplate (their sample implementation is 36 LoC to parse 3 properties) is not a significant improvement and building a couple of optional callbacks to allow data validation is hard. I obviously disagree with all of this.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是我的解决方案,它不是基于库(我找不到的),而是使用基础和客观-C运行时方法 - 如上所述:
然后很容易通过通过从
继承JSONMARSHALLABLE
,例如:model.h
:model.m
:somets of sosings elselse.m
:欢迎批评家呢(我不是很擅长目标C,并且可能使很多人造PAS
Here is my solution, which is not based on a library - as I couldn't find any - but instead using the Foundation and Objective-C runtime methods - as discussed in the comments above:
It is then easy to create custom model objects by inheriting from
JSONMarshallable
, like so:model.h
:model.m
:SomeThingElse.m
:Critics are welcome! (I'm not very good at Objective C and probably made a lot of faux pas ????)
Issues:
NSNumber*
(though C primitives work fine for non-nullable numbers), but I don't know how to represent nullable booleans - i.e. a field that is optional and not encoded when usingwithNullValues:NO
.Sending fields for which there are no properties (for example, the server I work with sends values in both snake-case and underscrore-case to make it easy to parse) throws exception.(solved by usingrespondsToSelector:
andsetValue:
instead ofsetValuesForKeysWithDictionary:
).Trying to set(solved by checking for property type andnil
values to primitive-typed fields causes exceptions.NSNull
).Doesn't work at all for nesting objects - i.e. a custom model object with properties that are also custom model objects.(solved by checking for property types and recursing encoding/decoding).