有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上的对象模型
问题:无法解析json的路径字段,因为有一个数组数组。 在具有单维的阵列的情况下,一切都很好。
答案 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 - 成功!