Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用RestKit将源JSON映射到结构不同的模型?_Ios_Json_Mapping_Restkit - Fatal编程技术网

Ios 如何使用RestKit将源JSON映射到结构不同的模型?

Ios 如何使用RestKit将源JSON映射到结构不同的模型?,ios,json,mapping,restkit,Ios,Json,Mapping,Restkit,我有一个固定结构的JSON和一个不同结构的固定数据模型。例如,对于源模型中对象的某些属性,我必须在目标数据模型中创建一个新对象,每个属性一个对象,在源模型中我不需要在目标数据模型中创建一些其他对象。总而言之,我需要将源模型映射到具有不同数量和结构的对象的结构不同的目标模型。使用RestKit可以吗?最好的方法是什么?我发现RKValueTransformer类组似乎是这类工作的工具,但只要我使用自定义转换转换顶级对象,我就必须使用字典。是否有任何方法可以从值转换器的块重新进入对象映射层次结构,以

我有一个固定结构的JSON和一个不同结构的固定数据模型。例如,对于源模型中对象的某些属性,我必须在目标数据模型中创建一个新对象,每个属性一个对象,在源模型中我不需要在目标数据模型中创建一些其他对象。总而言之,我需要将源模型映射到具有不同数量和结构的对象的结构不同的目标模型。使用RestKit可以吗?最好的方法是什么?我发现RKValueTransformer类组似乎是这类工作的工具,但只要我使用自定义转换转换顶级对象,我就必须使用字典。是否有任何方法可以从值转换器的块重新进入对象映射层次结构,以便能够使用其他映射来表示具有已知结构的对象?还是有更好的方法

这里有一个例子。假设我有以下JSON:

"label": {
  "title": "foo",
  "color": "red",
  "font": "times"
}
我必须将其映射到以下对象:

@interface Label : NSObject {
  @property (strong) NSString* title;
  @property (strong) NSArray* attributes; // array of Attribute
}

@interface Attribute : NSObject {
  @property (strong) NSString* key;
  @property (strong) NSString* value;
}
在某种程度上,生成的对象看起来像:

Label {
  title = @"foo",
  attributes = @[ 
    Attribute { key = @"color", value = @"red" },
    Attribute { key = @"font", value = @"times" }
  ]
}

您的问题超出了RestKit的标准范围。以下是您如何实现需求的想法(我没有尝试过):

对于要映射到属性中的每个键/值对,添加从源键到匹配目标键的关系映射。当我们需要截取设置的密钥并将提供的属性添加到公共数组中时,就会出现一些不干净的代码。我们可能可以使用
setValue:forUndefinedKey:
——首先尝试一下,因为它可以最小化代码。检查值的类型,如果是属性,则添加它。如果这不起作用,请查看添加
set########:(属性*)
方法

关系映射使用另一个映射。该映射需要获取属性的键和值:

RKObjectMapping *attributeMapping = [RKObjectMapping mappingForClass:[Attribute class]];
[attributeMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"key"];
[attributeMapping addAttributeMappingsFromDictionary:@{ @"(key)": @"value" }];

这是一个糟糕的映射。。。您有属性键名称的集合列表吗?我不认为值转换器是一种明智的方法,但您可能需要在数据对象中添加一些不干净的代码,以便在映射过程中对数据进行变异……是的,我提前知道可能的属性键。“变异数据”您的意思是向使用JSON片段作为字典的数据对象添加一些自定义setter-like方法?感谢您指向
addAttributeMappingFromKeyofRepresentationOnAttribute
,我不知道它。