如何使用对象映射器解析以下 JSON

Posted

技术标签:

【中文标题】如何使用对象映射器解析以下 JSON【英文标题】:how to parse following JSON using object mapper 【发布时间】:2016-02-25 04:25:34 【问题描述】:

这是 JSON

[ "start_hour": "08:00:00", "end_hour": "10:00:00", “通话时间”:“30” ]

我尝试解析如下

class DoctorAvailablityResponseData: Mappable 
var startDateHour : String?
var callDuration : Int?
var endDateHour : String?
required init?(_ map: Map)



func mapping(map: Map) 
    callDuration <- map["call_duration"]
    endDateHour <- map["end_hour"]
    startDateHour <- map["start_hour"]

  

let user = Mapper<ResponseDoctorAvailablity>().map(response.result.value)

但在解析时中断,发现 nil 值。

【问题讨论】:

【参考方案1】:

您的数据类型错误。您需要提供“DoctorAvailablityResponseData”,但您提供了 ResponseDoctorAvailablity 用于映射。

    let user = Mapper<ResponseDoctorAvailablity>().map(response.result.value)

例子

    class Doctor: Mappable 
        var startDateHour : String?
        var callDuration : String?
        var endDateHour : String?
        required init?(_ map: Map)

        

        func mapping(map: Map) 
            callDuration <- map["call_duration"]
            endDateHour <- map["end_hour"]
            startDateHour <- map["start_hour"]

        
    

    // Sample Response
    let response : NSMutableDictionary = NSMutableDictionary.init(object: "08:00:00", forKey: "start_hour");
    response.setValue("10:00:00", forKey: "end_hour");
    response.setValue("30", forKey: "call_duration");

    // Convert response result to dictionary type. It is very easy.
    let userdic = Mapper<Doctor>().map(response) // Map to correct datatype.
    NSLog((userdic?.callDuration)!);

    // If you result is nested object. you will easily get zero index position object and parse it.
    let nestedObjectArray :NSArray = NSArray.init(array: [response]);

    let userArray = Mapper<Doctor>().map(nestedObjectArray[0])


    NSLog((userArray?.callDuration)!);

【讨论】:

是的,这段代码可以工作,但我不想为此制作字典,json有什么问题吗? 我也可以这样做让 user = Mapper().map(response.result.value?.objectAtIndex(0)) 能否给出response.result.value? 我以为,你的响应结果是嵌套对象。 可能你的解决方案是,让 user = Mapper().map(response.result.value[0])【参考方案2】:

根据用户 JSON 'call_duration' 也是字符串类型。换行

var callDuration : Int?

到:

var callDuration : String?

【讨论】:

【参考方案3】:

你也可以将它们全部包装在一个“守卫”语句中,如果你得到一个 nil,你可以传入 0 来表示一个项目是空的或没有长度。

【讨论】:

问题不在于 nil,问题在于解析方式,我可以使用 nsjsonserialization 解析【参考方案4】:

您的 json 数据看起来像一个数组,其中第一个元素是字典。

[ "start_hour": "08:00:00", "end_hour": "10:00:00", "call_duration": "30" ]

除了把call_duration类型改成String?您是否尝试过确保您实际上将字典而不是数组传递给 map 函数?尝试只传递这个,看看它是否有效。

"start_hour": "08:00:00", "end_hour": "10:00:00", "call_duration": "30"

【讨论】:

以上是关于如何使用对象映射器解析以下 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 4 中使用对象映射器解析嵌套对象

如何修改 Spring Cloud AWS 用来反序列化 SQS 消息的对象映射器?

对象映射器 - 解析 [AnyObject] 的数组

如何使用杰克逊映射器自动识别不同的类型

使用Dropwizard时配置Jackson映射器

如何在 Kotlin 中解析 JSON?