JSON(JavaScript对象表示法)

JSON

一、概念

JavaScript Object Notation,意为JavaScript对象表示法,是一种存储和交换信息的数据格式,比xml更小、更快、更易于解析

二、语法

1. 基本规则

  1. 数据在键值对中,数据由键值对表示
    1. :键可以用引号也可以不用引号
    2. 值:取值可以为:
      • 数字(整数、浮点数),直接写
      • 字符串(在引号中)
      • 逻辑值(true or false)
      • 数组(在方括号中)
      • 对象(json对象,在花括号中)
      • null
  2. 数据由逗号分隔
  3. 花括号保存对象
  4. 方括号保存数组

2. 获取数据

  1. json对象.键名

  2. json对象[”键名“]:注意有引号

  3. 数组对象[索引]

    for(key in person) {
        alert(key + " : " + person[key]);
    }
    

三、JSON和java对象的转换

JSON解析器:Jsonlib(官方)、Gson(Google)、fastjson(Alibaba)、Jackson

1. java对象转为JSON

  1. 导入Jackson的相关jar包

  2. 创建Jackson核心对象ObjectMapper

    1. writeValue(参数, obj):参数的取值

      1. File:将obj对象转换为json字符串,并保存到指定的文件

      2. Writer:将obj对象转换为json字符串,并填充到指定的字符输出流

      3. OutputStream:将obj对象转换为json字符串,并填充到指定的字节输出流

    2. writeValueAsString(obj):将java对象转为json字符串

  3. 调用ObjectMapper的相关方法进行转换

    Person person = new Person("David", 18, "男");
    
    ObjectMapper mapper = new ObjectMapper();
    
    String json_person = mapper.writeValueAsString(person);
    mapper.writeValue(new File("d://a.txt"), person);
    
  4. 注解:当java对象有的成员变量是Date类型的时候,如果直接转为JSON得到的值是毫秒值,可以使用注解解决这个问题:在定义的类的成员变量上添加这两个注解:

    1. @JsonIgnore:表示在转为JSON时不考虑这个键值对

    2. @JsonFormat:表示在转为JSON时可以转为指定的格式

      @JsonFormat(pattern = "yyyy-mm-dd")

  5. 复杂的java对象:

    1. List:转为一个数组:[]
    2. Map:转为一个JSON对象:{}

2. JSON转为java对象

  1. 创建Jackson核心对象ObjectMapper

  2. ObjectMapper对象调用readValue方法:readValue(json字符串数据,Class)

    String json = "{"name":"david","age":18,"gender":"男"}";// 键值对要用双引号、单引号报错
    ObjectMapper mapper = new ObjectMapper();
    
    Person person = mapper.readValue(json, Person.class);
    

四、Demo:用户名是否存在的校验

实现逻辑:

  1. 当输入用户名的文本框失去焦点(blur事件),向服务器发送异步请求
  2. 服务器端接收请求,查询数据库,将结果填充进字符输入流

客户端:

$("#username").blur(function () {
    var username = $(this).val();
    $.get("findUsernameServlet", {username:username}, function (data) {// data 是服务端响应的数据
        var span = $("#span_username");
        
        if (data.userExist) {
            span.css("color", "red");
            span.html(data.msg);
        } else {
            span.css("color", "green");
            span.html(data.msg);
        }
    }, "json");// 格式为json
});

服务端:

response.setContentType("text/html;charset=utf-8");

String username = request.getParameter("username");

Map<String, Object> map = new HashMap<String, Object>();

if ("cat".equals(username)) {
    // 用户名已经存在,应该去查找数据库判断
    map.put("userExist", true);
    map.put("msg", "用户名已经存在");
} else {
    // 用户名没有存在
    map.put("userExist", false);
    map.put("msg", "用户名可用");
}

ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(), map);

注意:需要把服务器写会的数据当做JSON处理,两种方法:

  1. 在get/post请求里指定数据格式 “json”
  2. 在服务端指定编码、格式 response.setContentType("application/json;charset=utf-8");
原文地址:https://www.cnblogs.com/zhuobo/p/10854411.html