迅速。从JSON映射到对象模型。数组数组

时间:2014-10-10 07:26:07

标签: ios swift restkit

有JSON格式的模型

{
    "offline": false,
    "data": {
        "path": [
            [ {
                    "Latitude": 56.789351316653,
                    "Longitude": 60.6053340947616
                }, {
                    "Latitude": 56.78674,
                    "Longitude": 60.60613
                }
            ], [ {
                    "Latitude": 56.79071,
                    "Longitude": 60.60492
                }, {
                    "Latitude": 56.79129,
                    "Longitude": 60.60493
                } ]
        ] } }    

和swift上的对象模型

http://pastebin.com/j0mK8eYG

问题:无法解析json的路径字段,因为有一个数组数组。 在具有单维的阵列的情况下,一切都很好。

3 个答案:

答案 0 :(得分:1)

我必须做类似的事情。我查看了mtl_JSONArrayTransformerWithModelClass的实现,它将一个字典数组转换为MTLModel数组。所以我制作了一个类似的变换器,它需要一组字典/ MTLModel数组。我遍历最外面的数组并使用mtl_JSONArrayTransformerWithModelClass转换每个字典数组。

+ (NSValueTransformer *)JSONArrayOfArraysTransformerWithModelClass:(Class)modelClass

NSValueTransformer *arrayTransformer = [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:modelClass];

return [MTLValueTransformer
      reversibleTransformerWithForwardBlock:^id(NSArray *arrays) {
        if (arrays == nil) return nil;

        NSAssert([arrays isKindOfClass:NSArray.class], @"Expected an array, got: %@", arrays);

        NSMutableArray *modelArrays = [NSMutableArray arrayWithCapacity:[arrays count]];
        for (id JSONArray in arrays) {
          if (JSONArray == NSNull.null) {
            [modelArrays addObject:JSONArray];
            continue;
          }

          NSAssert([JSONArray isKindOfClass:NSArray.class], @"Expected an array of arrays of dictionaries, got array of: %@", JSONArray);

          NSArray *modelArray = [arrayTransformer transformedValue:JSONArray];
          if (modelArray == nil) continue;

          [modelArrays addObject:modelArray];
        }

        return modelArrays;
      }
      reverseBlock:^id(NSArray *arrays) {
        if (arrays == nil) return nil;

        NSAssert([arrays isKindOfClass:NSArray.class], @"Expected an array of arrays of MTLModels, got: %@", arrays);

        NSMutableArray *modelArrays = [NSMutableArray arrayWithCapacity:modelArrays.count];
        for (id modelArray in arrays) {
          if (modelArray == NSNull.null) {
            [modelArrays addObject:NSNull.null];
            continue;
          }

          NSAssert([modelArray isKindOfClass:NSArray.class], @"Expected an array of arrays, got array of: %@", modelArray);

          NSArray *array = [arrayTransformer reverseTransformedValue:modelArray];
          if (array == nil) continue;

          [modelArrays addObject:array];
        }

        return modelArrays;
      }];

}

答案 1 :(得分:0)

如果你想使用第三方:这个真棒且干净利落的开源objectMapper也适用于Alamofire。 创建实现协议“Mappable”的模型,并根据指定的类处理自定义数组。 像任何东西一样减少锅炉板代码。

如果你想自己解析它:只需在你的mdoel类中创建一个helper方法,用for循环解析它。

init (responseDict: [String: Any]) {
    var itemModels : [ItemClass] = []
    let itemDictArray = responseDict["items"] as! [[String:Any]]

    for itemDict in itemDictArray {
        itemModels.append(ItemClass.init(dict: (itemDict as [String:Any]) ))
    }
}

答案 2 :(得分:0)

1 - 通过在http://www.json4swift.com

复制相同的Json来生成Swift模型

2 - 将生成的文件复制到项目中

3 - 打开Data.swift,替换以下方法

required public init?(dictionary: NSDictionary) {
if (dictionary["path"] != nil) { path = Path.modelsFromDictionaryArray(dictionary["path"] as! NSArray) }
}

required public init?(dictionary: NSDictionary) {
if let paths = dictionary["path"] as? NSArray {

    let allPaths = NSMutableArray()
    for patharr in paths {
        allPaths.addObjectsFromArray(Path.modelsFromDictionaryArray(patharr as! NSArray))
    }

}
}

4 - 成功!