领域 + 对象映射器 + SwityJSON

Posted

技术标签:

【中文标题】领域 + 对象映射器 + SwityJSON【英文标题】:Realm + Object Mapper + SwityJSON 【发布时间】:2017-05-15 10:40:31 【问题描述】:

我在映射我的对象时需要帮助

领域模型:https://gist.github.com/n1tesh/7d6c6e155285dd6b39c8edba76f6eba5

我就是这样的

    // write request result to realm database
    let entries = json["data"]
    realm.beginWrite()
        let entry: ChatGroups = Mapper<ChatGroups>().map(JSONObject: entries)!
        realm.add(entry, update: true)

    do 
        try realm.commitWrite()
     catch 

    

JSON 响应:https://gist.github.com/n1tesh/bf84cbd930f8c76b340f21723a217ebe

但我遇到了错误 fatal error: unexpectedly found nil while unwrapping an Optional value

请帮我解决我做错了什么。

【问题讨论】:

如何获取json变量,它的类型是什么? @DávidPásztor 它的 JSON 类型。我正在使用 SwiftyJSON。 if let value = response.result.value let json = JSON(value) callback(true, json, nil) @Nitesh 我在你的映射中看到了一些不同的东西,updated_by 和 member 是数组,所以你必须使用 var members = List() 例如。尝试使用 RealmOptional() 而不是 Bool。有关您需要进行转换才能工作的列表,请参见:gist.github.com/Jerrot/fe233a94c5427a4ec29b @Nitesh 还有一件事,尝试使用 if let 语句。不要这样做 let entry: ChatGroups = Mapper().map(JSONObject: entries)!,如果 let entry: ChatGroups = Mapper().map(JSONObject: entries) . @JoséNeto 谢谢,但仍然面临这个问题。 【参考方案1】:

创建一个类来将 Array 转换为 List,因为 Realm 不接受数组。

import ObjectMapper
import RealmSwift

public class ListTransform<T:RealmSwift.Object> : TransformType where T:Mappable 
    public typealias Object = List<T>
    public typealias JSON = [AnyObject]

    let mapper = Mapper<T>()

    public init()

    public func transformFromJSON(_ value: Any?) -> Object? 
        let results = List<T>()
        if let value = value as? [AnyObject] 
            for json in value 
                if let obj = mapper.map(JSONObject: json) 
                    results.append(obj)
                
            
        
        return results
    

    public func transformToJSON(_ value: Object?) -> JSON? 
        var results = [AnyObject]()
        if let value = value 
            for obj in value 
                let json = mapper.toJSON(obj)
                results.append(json as AnyObject)
            
        
        return results
    

然后在您的 ChatGroups 类中,您必须调用 Transform 函数来进行转换,进行以下更改:

updated_by              <- map["updated_by"]
members                 <- map["member"]

到这里:

updated_by              <- (map["updated_by"], ListTransform<QuorgUser>())
members                 <- (map["member"], ListTransform<GroupMember>())

【讨论】:

谢谢,这解决了我的问题。感谢您为解决这个问题而付出的努力。 @Nitesh 没问题,伙计! :)【参考方案2】:

在您声明的 ChatGroup 类中

dynamic var image: String = ""

但在您的响应中,您的 JSON 响应的图像键为空。

您需要将您的声明转换为:

dynamic var image: String? = nil

【讨论】:

以上是关于领域 + 对象映射器 + SwityJSON的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何创建我的数据映射器/域对象/服务?

使用自动映射器映射对象列表

数据映射器与数据访问对象。区别。哪个更好? [复制]

具有核心数据的 Alamofire 对象映射器

Symfony 奏鸣曲 - 形式映射器

Spring 4 中 Websockets 的自定义对象映射器