mantle的Array与dictionary

本文详细介绍了如何使用JSON和Mantle框架解析JSON数据,并通过实例展示了如何创建自定义的数据模型类来适配JSON数据结构。重点介绍了如何实现属性与JSON键路径的映射,以及如何利用Mantle框架提供的特性来简化数据解析过程。

json格式:

NSDictionary *dict = @{

                           @"name": @"Bob",

                           @"cars": @[

                                  @{ @"make":@"ford",

                                     @"year": @"1972" },

                                  @{ @"make": @"mazda",

                                     @"year": @"2000" }

                                  ],

                           @"owner":@{

                                    @"name":@"arthur",

                                    @"gender":@"male",

                                    @"age": @101,

                               },

                           @"date":@"2015-09-02"

                           };

//.h

#import "MTLModel.h"

#import <Mantle.h>


@interface CarModel : MTLModel<MTLJSONSerializing>

@property (nonatomic, copy) NSString *make;

@property (nonatomic, copy) NSString *year;

@end


@interface Owner : MTLModel<MTLJSONSerializing>

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *gender;

@property (nonatomic) NSInteger age;

@end


@interface TestModel : MTLModel<MTLJSONSerializing>

@property (nonatomic, copy) NSString *name;

@property (nonatomic, strong) NSArray *cars;

@property (nonatomic, strong) Owner *owner;

@property (nonatomic, copy) NSString *ownername;

@property (nonatomic, copy) NSString *maker;

@end


//.m

#import "TestModel.h"

@implementation CarModel


+ (NSDictionary *)JSONKeyPathsByPropertyKey{

    return @{@"make":@"make",@"year":@"year"};

}


@end


@implementation Owner


+ (NSDictionary*)JSONKeyPathsByPropertyKey{

    return @{@"name":@"name",

             @"gender":@"gender",@"age":@"age",

             };

}


@end

@implementation TestModel


//指向一个array的映射

+ (NSValueTransformer *)carsJSONTransformer {

    return [MTLJSONAdapter arrayTransformerWithModelClass:CarModel.class];

}


//指向一个dict的映射

+ (NSValueTransformer*)ownerJSONTransformer{

    return [MTLJSONAdapter dictionaryTransformerWithModelClass:Owner.class];

}


+ (NSDictionary *)JSONKeyPathsByPropertyKey

{

    return @{

             @"name":@"name",

             @"cars":@"cars",

             @"owner":@"owner",

             @"ownername":@"owner.name",

             @"maker":@"cars",

             };

}

//找出cars下第一个itemmake

+ (NSValueTransformer *)makerJSONTransformer {

    return [MTLValueTransformer transformerUsingForwardBlock:^id(NSArray *cars, BOOL *success, NSError **error) {

        return [cars.firstObject valueForKey:@"make"];

    }];

}


开始解析:

NSError *error;

TestModel *tm = [MTLJSONAdapter modelOfClass:[TestModel class] fromJSONDictionary:dict error:&error];

NSLog(@"%@",tm);

CarModel *car = [tm.cars objectAtIndex:1];

NSLog(@"%@",car.make);

Owner *owner = tm.owner;

NSLog(@"%@",owner.name);

NSLog(@"%@",tm.ownername);//直接取子类别下数据




<think> 我们正在讨论MUMPS(现在称为M)中的%Dictionary包。这是一个用于元数据管理的系统类,允许开发者在运行时检查和操作类定义、方法、属性等。 注意:根据用户要求,我们需要使用中文回答,并遵守格式要求(行内数学公式用$...$,独立公式用$$...$$,但本主题可能较少涉及数学公式,但若有变量名等,我们按规则处理)。 %Dictionary包是MUMPS数据库(如Caché或IRIS)中一个非常重要的工具,它提供了对类定义的编程访问。通过%Dictionary,我们可以动态地查询、创建或修改类定义。 下面我们将介绍%Dictionary的主要类、使用方法和相关知识。 1. %Dictionary包的主要类: - %Dictionary.ClassDefinition: 表示一个类的定义,可以获取或设置类的属性、方法、参数等。 - %Dictionary.PropertyDefinition: 表示类的属性定义。 - %Dictionary.MethodDefinition: 表示类的方法定义。 - %Dictionary.ParameterDefinition: 表示类的参数定义。 - %Dictionary.CompiledClass: 提供已编译类的信息(只读)。 - 等等。 2. 使用%Dictionary查询类信息: 我们可以通过%Dictionary.ClassDefinition类的ID(即类名)来打开一个类定义对象,然后访问其属性。 例如,获取类"Sample.Person"的超类: ``` set classDef = ##class(%Dictionary.ClassDefinition).%OpenId("Sample.Person") if $isobject(classDef) { write "Superclass: ", classDef.Super } ``` 3. 动态创建类: 我们可以使用%Dictionary.ClassDefinition来动态创建一个新类。 例如,创建一个名为"MyClass.DynamicClass"的类: ``` set cls = ##class(%Dictionary.ClassDefinition).%New("MyClass.DynamicClass") set cls.Super = "%Persistent" set cls.ProcedureBlock = 1 // 设置过程块 // 添加一个属性 set prop = ##class(%Dictionary.PropertyDefinition).%New() set prop.Name = "MyProperty" set prop.Type = "%String" do cls.Properties.Insert(prop) // 保存类定义 set status = cls.%Save() if $$$ISERR(status) { do $system.OBJ.DisplayError(status) } ``` 注意:保存后需要编译该类,可以使用$system.OBJ.Compile("MyClass.DynamicClass") 4. 查询类的属性列表: 我们可以使用%Dictionary.ClassDefinitionQuery来查询。 例如,使用SQL查询: ``` SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH 'Sample' ``` 或者使用%Dictionary.ClassDefinition的另一个查询: ``` set stmt=##class(%SQL.Statement).%New() set status=stmt.%PrepareClassQuery("%Dictionary.ClassDefinition","SubclassOf") if $$$ISERR(status) { /* 错误处理 */ quit } set rset=stmt.%Execute("%Persistent") while rset.%Next() { write rset.%Get("Name"),! } ``` 5. 注意事项: - 使用%Dictionary修改类定义可能会影响应用程序的稳定性,特别是在生产环境中。 - 使用%Dictionary创建的类在编译后,就可以像普通类一样使用。 - %Dictionary.CompiledClass提供的信息是只读的,它反映的是已编译的类的状态。 6. 相关技术: - 反射(Reflection): %Dictionary实现了反射机制,允许在运行时检查类结构。 - 元数据(Metadata): %Dictionary存储了类的元数据。 参考文献: [1] InterSystems Documentation, "Class Reference: %Dictionary Package" 由于用户要求生成相关问题,我们根据主题生成以下问题: §§相关问题§§ 1. %Dictionary.ClassDefinition和%Dictionary.CompiledClass有什么区别? 2. 如何使用%Dictionary动态添加方法到类中? 3. 在MUMPS中,如何通过%Dictionary查询某个类的所有属性? 4. %Dictionary在哪些场景下特别有用? </think> ### MUMPS中%Dictionary的介绍使用 #### 一、%Dictionary概述 %Dictionary是MUMPS数据库(如InterSystems IRIS/Caché)中关键的**元数据管理工具**,提供对类定义、属性、方法等元素的编程访问能力[^1]。它属于**系统类包**(%Dictionary.*),包含以下核心组件: 1. **%Dictionary.ClassDefinition**:类定义元数据 2. **%Dictionary.PropertyDefinition**:属性定义元数据 3. **%Dictionary.MethodDefinition**:方法定义元数据 4. **%Dictionary.CompiledClass**:已编译类的只读视图 其主要功能包括: - 动态创建/修改类结构 - 运行时反射类信息 - 自动化文档生成 - 数据库迁移支持 #### 二、核心使用方法 ##### 1. 查询类定义 ```mumps Set clsDef = ##class(%Dictionary.ClassDefinition).%OpenId("Sample.Person") Write "类描述: ", clsDef.Description Write "超类: ", clsDef.Super ``` ##### 2. 动态创建类 ```mumps Set newClass = ##class(%Dictionary.ClassDefinition).%New("MyApp.DynamicClass") Set newClass.Super = "%Persistent" Set newClass.ProcedureBlock = 1 // 添加属性 Set prop = ##class(%Dictionary.PropertyDefinition).%New() Set prop.Name = "DynamicProp" Set prop.Type = "%String" Do newClass.Properties.Insert(prop) Set status = newClass.%Save() If $$$ISOK(status) { Do $system.OBJ.Compile("MyApp.DynamicClass", "c") } ``` ##### 3. 反射方法信息 ```mumps Set methodDef = ##class(%Dictionary.MethodDefinition).%OpenId("Sample.Person||CalculateAge") Write "方法类型: ", methodDef.ClassMethod // 1=类方法, 0=实例方法 Write "代码实现: ", methodDef.Implementation ``` #### 三、关键技术特性 1. **编译运行时差异**: - `%Dictionary.ClassDefinition`:编译前可修改的定义 - `%Dictionary.CompiledClass`:编译后的只读视图 2. **SQL访问接口**: ```sql SELECT * FROM %Dictionary.PropertyDefinition WHERE parent = 'Sample.Person' ``` 3. **版本控制支持**: - 通过`%Dictionary.ClassDefinitionVersion`跟踪类修改历史 - 使用`%Export()`方法生成XML定义文件 4. **权限管理**: - 需`%DB_%Dictionary`资源写权限才能修改类定义 - 安全操作建议:`$$$SetRole("%Developer")` #### 四、典型应用场景 1. **动态建模**:根据外部数据源实时创建数据模型 2. **代码生成器**:自动化生成CRUD操作代码 3. **系统文档工具**:提取类关系图(如:`^%GSHE`工具) 4. **升级脚本**:跨版本类定义比对(`%Library.ClassDefinition`的`Diff()`方法) > 注意:生产环境修改类定义需谨慎,可能触发级联编译。建议在开发环境操作并使用源码控制[^2]。 [^1]: InterSystems官方文档《Class Reference: %Dictionary Package》 [^2]: 《Caché 编程指南》第5章"使用类定义"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值