Java中关于json的几个细节

在spring中访问一个接口,如果要得到一个json返回值,需要两个前提条件:

1.注解声明,要使用json格式进行返回:(两种方式)

  ①使用@ResponseBody

  ②使用@RestController

2.相关jar包:(常用的两种)

  ①json-lib

  @jackson-core-asl

Json-lib依赖commons系列的包及 ezmorph包共 5个,而Jackson除自身的以外只依赖于commons-logging

 

我平常使用的JSONObject 和 JSONArray这两个对象和相应方法都是json-lib中的,这个jar是个老牌jar包,可用,但是有缺陷,速度上远远不如jackson,而且数据的处理也干净

比如:对时间的处理

    public JSONObject getQrcodeBackgroundNew(HttpServletRequest request){
        JSONObject json = new JSONObject();
        try {
            Date date = new Date();
            json.put("date", date);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return json;
    }

返回值:

{
    "date": {
        "date": 10,
        "day": 2,
        "hours": 10,
        "minutes": 14,
        "month": 3,
        "seconds": 36,
        "time": 1523326476676,
        "timezoneOffset": -480,
        "year": 118
    }
}

可以看到数据的处理是非常繁琐的

而如果使用jackson:

@RequestMapping("/getQrcodeBackgroundNew")
    public Map<String, Object> getQrcodeBackgroundNew(HttpServletRequest request){
        Map<String, Object> json  = new HashMap<>();
        try {
            
            Date date = new Date();
            json.put("date", date);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return json;
    }

返回值:

{
    "date": 1523330326860
}

 需要注意的是,我们在写接口时,尽量不要返回前端value为null的key,比如这种情况:

public class User {
    private String name;
    private String title;
    private int age;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

@RestController
public class DemoController {

    @RequestMapping("/getUser")
    public User getUser(){
        User u = new User();
        u.setName("2009");
        return u;
    }
}

 此时访问,返回值如下:

{
    "name": "伍声2009",
    "title": null,
    "age": 0
}

 如果不想和前端打起来,最好把这一块处理好,如果使用jackson,需要导入和jackson相关的几个包

jackson2.*后导包;

            <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.7</version>
        </dependency>        

然后在实体类User上使用@JsonInclude(JsonInclude.Include.NON_NULL)配置

这样,经过处理的返回值就不会过滤value为null的数据

{
    "name": "伍声2009",
    "age": 0
}

 

posted @ 2018-04-10 11:48  一介書生  阅读(128)  评论(0)    收藏  举报