HandyJSON + RealmSwift 坑

本文探讨了在Swift环境下,使用HandyJSON进行JSON与Model转换时遇到的兼容性问题,特别是与RealmSwift结合使用时出现的字段转换失败现象。通过详细排查,发现了dynamic属性和自定义字段映射是导致问题的关键,并提供了两种临时解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近要新搞一个项目, 然后选定了数据库用 RealmSwift, Model 和 JSON 互转用 HandyJSON
这两个合起来用( 准确来说, 只是HandyJSON本身的问题 ), 引发了一个问题, JSON 转 Model 的时候, Model 值一直不出来
后来, 经过一系列排查, 才找到问题所在( 表面问题, 没去看源码 ), 然后也算半解决状态了吧

HandyJSON 版本: 5.0.0
Swift 版本: 5.0

我目前的解决方法,有两个, 都不是很好, 不过抛转引玉, 肯定会有更好的方法的 ( 如广大网友, 有更好的方法, 可以留言 )

示例 JSON 为

{
	"Name":"老王"
}

先放一开始的代码

// 继承 RealmSwift 的 Object, 并且遵守 HandyJSON 协议
class XQTestModel: Object, HandyJSON {

    @objc dynamic var xq_name: String?

    func mapping(mapper: HelpingMapper) {
    	// Name 映射为 xq_name
        mapper <<<
            self.xq_name <-- "Name"
    }
    
}

很简单的代码, 就是把 Name 映射为 xq_name, 但转换时, 却为空 =_=

排查

有问题, 那肯定有解决办法. 那么, 就进入排查阶段. ( 说一下思路,不喜的, 直接跳过 )

RealmSwift 和 HandyJson 一起用的时候, 转换不了. 平常就不会, 那么, 我们从用了 RealmSwift 之后, 会有那些不一样的地方开始排查

  1. Object
    类 , 不用 RealmSwift 的 Object, 换成系统的 NSObject, 结果不行, 排除 ( 这里就可以看出, 其实跟 RealmSwift 无太大关系了 )

  2. @objc
    删除之后, 还是不行, 排除

  3. dynamic
    删除之后, 可以了. 那么可以先缩小范围在 dynamic 上

  4. mapping
    保持存有 dynamic 字段, 把 xq_name 改回和 JSON 一致 Name, 然后移除 mapping 内容.
    结果是可以的.

那么先知道了, 映射字段 和 dynamic 这两个问题所在, 就能离答案更进一步了. 起码现在知道, 单纯只是 HandyJSON 自己不支持 dynamic 和 mapping 混用. 不要错怪了 RealmSwift

最后想来想去, 就想到以下两个方法解决.( 感觉算不上解决方案 ?, 其实最好还是去看 mapping 源码, 估计是这一块出了问题 )

ps: GitHub 上也有人提了, 不过 HandyJSON 的大佬一直没去解决 ㄟ( ▔, ▔ )ㄏ

解决办法1: 直接用后台传来的 Key

如果你并不介意直接用后台传来的key, 那么就可以直接声明

@objc dynamic Name: String?

这样就算有 dynamic, 也是可以用的. 当然, 如果你愿意这样, 那么也不会来寻求答案, 那么可以看看第二种

解决办法1: 利用 willSet

代码如下

class XQTestModel: NSObject, HandyJSON {
    
    required override init() {
        super.init()
    }
    
    @objc private var Name: String?
    {
        willSet {
            xq_name = newValue
        }
    }
    
    @objc dynamic var xq_name: String?
    
}

这个方法虽然有点蠢, 主要代码量太大,但是起码能解决目前的问题.

ps: 如有更好的方法, 请告诉我, 因为我也不想再用这么蠢的方法了 (╯﹏╰)

参考文章

Realm使用中碰到的问题(坑)及解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值