Json和Bean间的序列化和反序列化(JSONObject、Gson、FastJson的使用)

版权声明:如果您觉得此文有用或对您有帮助,请关注我吧! https://blog.csdn.net/fanrenxiang/article/details/78246870

json格式校验

日常开发经常涉及到和json的交互,以下原因会常常会使json格式错误:

1、json串的非数字型的键值没有双引号

2、json中存在\t这样的表符,这个比较难发现

3、json中缺少{}或[]导致结构不完整

可以通过FE助手或网页版的json校验json格式正确与否,本篇使用json示例如下

两个实体类定义如下(如下注解参考博文lombok的使用):

@Setter
@Getter
@NoArgsConstructor
public class UserInfo {
    private String userName;
    private String tel;
    private List<Details> details;
}
@Setter
@Getter
@NoArgsConstructor
public class Details {
    private String address;
    private String no;
    private String birth;
}

使用net.sf.json处理json

<dependency>
  <groupId>net.sf.json-lib</groupId>
  <artifactId>json-lib</artifactId>
  <version>2.4</version>
  <classifier>jdk15</classifier>
</dependency>

使用JSONObject实现上述 json<-->bean 的序列化和反序列化

public static void main(String[] args) {
        // json--->bean
        String json = "{\"userName\":\"simons\",\"tel\":\"18705979156\",\"details\":[{\"address\":\"sdfsdf\",\"no\":\"9527\",\"birth\":\"2018.01.01\"},{\"address\":\"dfdfd\",\"no\":\"9528\",\"birth\":\"2017.12.12\"}]}";
        Map<String,Class<Details>> map = new HashMap<>();
        map.put("details",Details.class);
        UserInfo user = (UserInfo)JSONObject.toBean( JSONObject.fromObject(json),UserInfo.class,map);
        // bean--->json
        UserInfo ui = new UserInfo();
        ui.setTel("17805987986");
        ui.setUserName("simonsfan");
        List<Details> detailsList = new ArrayList<>();
        for (int i = 0; i <2 ; i++) {
            Details details = new Details();
            details.setAddress("sdfsdf"+i);
            details.setBirth("2018.01.01");
            details.setNo("1223"+i);
            detailsList.add(details);
        }
        ui.setDetails(detailsList);
        String s = JSONObject.fromObject(ui).toString();
        System.out.println(s);
    }

使用Gson处理json

Gson是一个Google提供的Java库,非常方便的实现json和bean的相互转换

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.7</version>
</dependency>
    public static void main(String[] args) {
        // json--->bean
        String json = "{\"userName\":\"simons\",\"tel\":\"18705979156\",\"details\":[{\"address\":\"sdfsdf\",\"no\":\"9527\",\"birth\":\"2018.01.01\"},{\"address\":\"dfdfd\",\"no\":\"9528\",\"birth\":\"2017.12.12\"}]}";
        UserInfo userInfo = new Gson().fromJson(json, UserInfo.class);
        // bean--->json
        // bean--->json
        UserInfo ui = new UserInfo();
        ui.setTel("17805987986");
        ui.setUserName("simonsfan");
        List<Details> detailsList = new ArrayList<>();
        for (int i = 0; i <2 ; i++) {
            Details details = new Details();
            details.setAddress("sdfsdf"+i);
            details.setBirth("2018.01.01");
            details.setNo("1223"+i);
            detailsList.add(details);
        }
        ui.setDetails(detailsList);
        String result = new Gson().toJson(ui);
        System.out.println(result);
    }

使用Gson处理json的话,一般会先实现json--->bean的序列化,方便使用,这点不同于jsonObject处理json,可以直接根据json中key来获取value

使用FastJson处理json

fastjson是阿里巴巴提供的json解析库,性能还不错

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.38</version>
 </dependency>
    public static void main(String[] args) {
        // json--->bean
        String json = "{\"userName\":\"simons\",\"tel\":\"18705979156\",\"details\":[{\"address\":\"sdfsdf\",\"no\":\"9527\",\"birth\":\"2018.01.01\"},{\"address\":\"dfdfd\",\"no\":\"9528\",\"birth\":\"2017.12.12\"}]}";
        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(json);
        UserInfo userInfo = jsonObject.toJavaObject(UserInfo.class);
        System.out.println(userInfo);
        // bean---json
        UserInfo ui = new UserInfo();
        ui.setTel("17805987986");
        ui.setUserName("simonsfan");
        List<Details> detailsList = new ArrayList<>();
        for (int i = 0; i <2 ; i++) {
            Details details = new Details();
            details.setAddress("sdfsdf"+i);
            details.setBirth("2018.01.01");
            details.setNo("1223"+i);
            detailsList.add(details);
        }
        ui.setDetails(detailsList);
        String result = com.alibaba.fastjson.JSONObject.toJSONString(ui);
        System.out.println(result);
    }

对比这三者处理正常的json(不是大的json文件)速度后,fastjson实现序列化和反序列化的效率还是比较高的,个人倾向于使用fastjson.

猜你喜欢

转载自blog.csdn.net/fanrenxiang/article/details/78246870