FastJson在Android中的使用

以前都是使用Gson,从来没使用过FastJson。今天偶尔在一个项目中看到,就简单了解一下。
先交代使用到的两个类

User类

public class User {

    private Long id;
    private String address;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", address='" + address + '\'' +
                '}';
    }
}

Group类

public class Group {

    private Long id;
    private String name;
    private List users = new ArrayList();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List getUsers() {
        return users;
    }

    public void setUsers(List users) {
        this.users = users;
    }

    public void addUser(User user) {
        users.add(user);
    }

    @Override
    public String toString() {
        return "Group{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", users=" + users +
                '}';
    }
}

Java对象转化为Json字符串

JSON.toJSONString(Object object)

 Group group = new Group();
        group.setId(0L);
        group.setName("admin");

        User guestUser = new User();
        guestUser.setId(2L);
        guestUser.setAddress("shanghai");

        User rootUser = new User();
        rootUser.setId(3L);
        rootUser.setAddress("beijing");

        group.addUser(guestUser);
        group.addUser(rootUser);
        String jsonString = JSON.toJSONString(group);
        Log.e(TAG, "simpleEncode: " + jsonString);

输出结果

{"id":0,"name":"admin","users":[{"address":"shanghai","id":2},{"address":"beijing","id":3}]}

另外这个方法还有一个重载的方法可以格式化输出的json字符串。

JSON.toJSONString(Object object, boolean prettyFormat)

输出结果如下所示

FastJson在Android中的使用_第1张图片

Json字符串转化成Java对象

JSON.parseObject(String text, Class clazz)

 String json = "{\"id\":0,\"name\":\"admin\",\"users\":[{\"id\":2,\"address\":\"guest\"},{\"id\":3,\"address\":\"root\"}]}";
 Group group = JSON.parseObject(json, Group.class);
 Log.e(TAG, "simpleDecode: " + group);

输出结果

 Group{id=0, name='admin', users=[User{id=2, address='guest'}, User{id=3, address='root'}]}

JSON.parseObject(String text, TypeReference type, Feature… features)

String genericJson = "{\"user\":{\"address\":\"Beijing\",\"id\":24}}";
        Map<String, User> map = JSON.parseObject(genericJson, new TypeReferenceString, User>>() {
        });
        Log.e(TAG, map.get("user").toString());

输出结果

User{id=24, address='Mack'}

注意:json字符串转化成java对象字段不区分大小写 如下所示。

String json = "{\"id\":2,\"Address\":\"shanghai\"}";
        User user = JSON.parseObject(json, User.class);
        Log.e(TAG, user.getAddress());

输出结果

shanghai

即json字符串中的Address字段映射成了java对象中的address字段。

@JSONField注解的使用

1 作用于get方法上:当把注解作用于get方法上的时候,在把Java对象转化成Json字符串的时候,Java对象中的字段名会转化为注解中的name指定的字段名。

@JSONField(name = "myAddress")
    public String getAddress() {
        return address;
    }
  User guestUser = new User();
        guestUser.setId(2L);
        guestUser.setAddress("guangzhou");
        String json = JSON.toJSONString(guestUser);
        Log.e(TAG, json);

输出结果

{"id":2,"myAddress":"guangzhou"}

在上面的例子中,Java对象中的address字段,在生成的json字符串中的字段名是myAddress。

2 作用于set方法上:在把json字符串转化成java对象的时候,注解中的name指定的字段名会映射为Java对象中的字段名。

@JSONField(name = "add")
    public void setAddress(String address) {
        this.address = address;
    }
String json = "{\"id\":2,\"add\":\"shanghai\"}";
        User user = JSON.parseObject(json, User.class);
        Log.e(TAG, user.getAddress());

输出结果

shanghai

可以看到java对象中address字段被赋值为json字符串中addr所对应的值。

另外,如果服务器传递过来的json字符串,可能会有差异,传递过来User的address的字段可能是add,也可能是 address,还可能是 Addr,那么我们可以使用如下方式,兼容上面的情况。

@JSONField(name = "add",alternateNames = {"address","Addr"})
    public void setAddress(String address) {
        this.address = address;
    }

3 @JSONField作用于java类的字段上

@JSONField(name = "address", alternateNames = {"addr", "add"})
    private String address;
User guestUser = new User();
        guestUser.setId(2L);
        guestUser.setAddress("guangzhou");
        String json = JSON.toJSONString(guestUser);
        Log.e(TAG, json);

当java对象转化成json字符串的时候,address字段映射成address。当json字符串转化为java对象的时候,address,addr,add都可以映射为java类的address字段。

参考链接
【1】http://blog.csdn.net/u011425751/article/details/51219242
【2】http://blog.csdn.net/shulianghan/article/details/41011605

你可能感兴趣的:(Andrid-开源框)