json元数据模型设计

将JSON映射为实体对象

iOS开发人员已经习惯于将JSON转换为字典或者数组来进行操作了,接下来我要做的事情,可能匪夷所思,但是,对WP和Android开发人员而言,他们更倾向于将JSON转换为实体对象进行操作。

我所设计的客户端框架,三个平台之间互相取长补短,保持统一的思想,而其中最重要的一环就是,面向对象的编程方式。

书接上文,我在异步调用完MobileAPI并成功获取到JSON后,仅仅将其转换为jsonValue,如下所示:

json元数据模型设计_第1张图片

后续要做的事情,就是把jsonValue转换为实体对象了。

首先,要说一下JSON的格式。

MobileAPI返回的JSON字符串有几种格式:

1)单一实体:

a)简单属性:

{

    "userName": "baobao",

    "userAge": 18

}

b)属性中有复合属性,且该复合属性是另一个自定义实体:

{

     "UserId": 1,

     "UserInfo": {

              "userName": "baobao",

       "userAge": 18

}

}

c)属性中有复合属性,且该复合属性是一个数组:

{

     "Career": "IT",

     "Users": [

        {

             "userName": "Bill.Gates",

             "userAge": 60

        },

        {

             "userName": "baobao",

             "userAge": 18

        }

    ]

}

2)数组

    a)规范的写法:

    {

    "Users": [

        {

            "userName": "Bill.Gates",

            "userAge": 60

        },

        {

            "userName": "baobao",

            "userAge": 18

        }

    ]

}    

    b)不规范的写法:

    [

    {

        "userName": "Bill.Gates",

        "userAge": 60

    },

    {

        "userName": "baobao",

        "userAge": 18

    }

]


对以上格式进行归纳,我们发现,只需要指定好:

1)整个JSON字符串是规范的(这时是一个字典),还是不规范的(这时是一个数组)

2)对于规范的JSON字符串,每个JSON字段映射为实体的哪个字段,就是说,from是什么,to是什么?

3)实体字段的数据类型。对于JSON而言,简单类型,只有NSString和NSNumber两种(日期按字符串对待,布尔值按整数0和1对待)。复合类型,有2种:要么是一个自定义实体(这时是一个字典),要么是一个数组。

基于此,我们创建统一格式的实体格式如下:

//以下为UserEntity.h文件:

#import 

 

@class ObjectMapping;

 

@interface UserEntity : NSObject

{

NSString *name;

NSNumber *age;

}

 

@property (nonatomic,retain) NSString *name;

@property (nonatomic,retain) NSNumber *age;

 

- (ObjectMapping *)objectMapping;

 

@end

//以下为UserEntity.m文件:

#import "UserEntity.h"

#import "ObjectMapping.h"

 

@implementation UserEntity

 

@synthesize name;

@synthesize age;

 

- (ObjectMapping *)objectMapping {

ObjectMapping *mapping = [ObjectMapping mappingForClass:[UserEntity class]];

[mapping converEntityFromJsonToEntity:@"userName" to:@"name" withClass: @"NSString"];

[mapping converEntityFromJsonToEntity:@"userAge" to:@"age" withClass: @"NSNumber"];

return mapping;

}

 

- (void)dealloc {

[name release];

[age release];

 

[super dealloc];

}

 

@end

  

在格式统一的情况下,我们来讨论在MyApp中是如何使用的,参见APageViewController.m文件,我们继续改造上一节没有完成的requestFinished方法:

201309101117.jpg

通过ObjectMappingLoader的loadObjectWithClassName方法,我们将jsonValue转换为实体result,然后再一次将result强制转换为WeatherWrapEntity类型的实体。接下来我们就可以使用weatherWrapEntity实体中的任何属性了,都是JSON里面返回的数据。

使用起来非常简单,但这一切都是MyLib类库下ObjectMapping目录中的3个类来实现的:

json元数据模型设计_第2张图片

原理比较简单,使用到了迭代算法,把JSON格式的字符串先转换为字典,然后再迭代之,转换为实体。

本节源码如下: YoungHeart-Chapter-05-1.zip

另外,对各种情况的模拟,参见MyApp下的MyAppTest目录,这是一个单元测试,相应的Target为MyAppTests,每次修改MyLib的时候不是要把libMyLib.a重新引入到MyApp项目的MyApp这个Target中嘛,请同时将其也引入到MyAppTests这个Target中。



json字符串与java对象互相转换

1、JSON定义

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,减肥的xml,易于阅读和编写,同时也易于机器解析和生成。它基于ECMA262语言规范(1999-12第三版)中JavaScript编程语言 的一个子集。JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的习惯,这些特性使JSON成为理想的数据交换格式。

2、JSON的结构

1). "名称/值"对的集合 不同语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),键列表(keyed list)等

2). 值的有序列表 多数语言中被理解为数组(array)

3、JSON使用

JSON以一种特定的字符串形式来表示 JavaScript 对象。如果将具有这样一种形式的字符串赋给任意一个 JavaScript 变量,那么该变量会变成一个对象引用,而这个对象就是字符串所构建出来的。

例如:

 

4、归纳:

1).对象是属性、值对的集合。一个对象的开始于“{”,结束于“}”。每一个属性名和值间用“:”提示,属性间用“,”分隔。

2).数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。

5、应用:

1).对象转换成json字符串,返回给页面。这样页面js取值很方便,不再像xml还要解析。多用于ajax请求,服务器端返回给客户端json数据。

2).json字符串转换成对象。配置文件写成json数据格式,读取配置文件后转换成对象,很容易取到配置信息。

6、实例:引入包(引自struts-2.1.8.1\lib)

  json-lib-2.1.jar 
  commons-collections-3.2.jar 
  commons-beanutils-1.7.0.jar 
  commons-lang-2.3.jar 
  commons-logging-1.0.4.jar 
  ezmorph-1.0.3.jar 
  
  public class ActionName { 
  private String namespace;
  private String actionname; 
  get、set略
  }
 public class Authorization{
  private int category; 
  private List list;
  get、set略
  }

1)对象转换成json字符串

      public class PojoToJson {
       public static void main(String[] args) {
         
        ActionName o=new ActionName();
        o.setActionname("test");
        o.setNamespace("/space");
        JSONObject jo = JSONObject.fromObject(o); 
 
        System.err.println(jo.toString());
  
        ActionName o1=new ActionName();
        o1.setActionname("test1");
        o1.setNamespace("/space"); 
 
        List list=new ArrayList();
        list.add(o);
        list.add(o1);
        Authorization a=new Authorization();
        a.setCategory(1);
        a.setList(list);
        JSONObject json = JSONObject.fromObject(a); 
        System.err.println(json.toString());
        }
       }

2)json字符串转换成对象

authorization.txt内容

authorization=[{"category"
:"1","list":[{"namespace"
:"/user","actionname"
:"login"},{"namespace"
:"/user","actionname"
:"register"}]},{"category"
:"2","list":[{"namespace"
:"/user","actionname"
:"listUser"},{"namespace"
:"/user","actionname"
:"updateUser"}]}]
public class JsonToPojo { 
  
public static void main(String[] args) throws IOException { 

Properties properties = new Properties(); 
properties.load(new FileInputStream("E:\\authorization.txt")); 
String authorization=(String) properties.get("authorization"); 
System.err.println("jsonString:"+authorization); 

JSONArray ja = JSONArray.fromObject(authorization); 
Map>
classMap = new HashMap>(); 
classMap.put("list", ActionName.class); 
List
list = JSONArray.toList(ja, Authorization.class,classMap);

for(Authorization c:list){
System.err.println("category:"+c.getCategory()); 
for(ActionName n:c.getList()){
System.err.println("actionname:"+n.getActionname());
System.err.println("namespace:"+n.getNamespace()); 
} 
} 
} 
}
	


实现方案实例流程:

json 元数据模型(格式模型,数据模型用来测试)
1:自定义格式定义、格式校验
2:数据解析(编码/解码)
3:json to object 或 object to json

你可能感兴趣的:(前端开发)