JSON 入门

1. 什么是 JSON

  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.
  • JSON 是用字符串来表示 JavaScript 对象, 例如可以在 Servlet 中发送一个 JSON 格式的字符串给
    客户端 JavaScript, JavaScript 可以执行这个字符串,得到一个 JavaScript 对象.

2. JSON 对象语法

2.1 JSON 语法
  • 数据由逗号分隔;
  • 花括号保存对象;
  • 方括号保存数组;
  • 属性名必须使用双引号括起来, 单引号不行!!
  • 示例: var person = {"name":"zhangsan","age": 18,"sex":"male"};
2.2 JSON 值
  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null
// 示例
    <html>
        <head>
            <script type="text/javascript">
                window.onload = function(){

                    var str = "{"name":"zhangsan", "age":18, "sex":"male"}";

                    // eval: 将字符串当成 javascript 代码来执行
                    // 此处返回的是 {"name":"zhangsan","age":18,"sex":"male"}, 表示 JSON 对象
                    var person = eval("("+str+")");
                    alert(person.name+","+person.age+","+person.sex);
                }
            </script>
        </head>
        <body>
        </body>
    </html>

# parse(): JS 中用于从一个字符串中解析出json对象; 
# stringfy(): JS 中用于从一个对象解析出字符串;

3. JSON-lib

3.1 它是什么?
  • 它可以把 JavaBean 转换成 JSON 串;
3.2 jar 包
  1. 核心包: json-lib.jar
  2. 依赖包:
    • commons-lang.jar
    • commons-beanutils.jar
    • commons-logging.jar
    • commons-collections.jar
    • ezmorph.jar
    • xom-1.1.jar
3.3 核心类
  1. JSONObject

    • 父类为 Map
    • toString()
    • JSONObject map = JSONObject.fromObject(person); 把对象转换成 JSONObject 对象;
  2. JSONArray

    • 父类为 List
    • toString()
    • JSONArray jsonArray = JSONArray.fromObject(list); 把 list 转换成 JSONArray 对象;

4. FastJson

  • 它也可以把 JavaBean 转换成字符串, 由阿里提供;

常用方法

  • String s = JSON.toJSONString(集合);
  • String s = JSON.toJSONString(对象);
// 存在问题一: 默认情况下, fastjson 的循环引用
public void fun(){
    List<Customer> list = new ArrayList<Customer>();
    Customer c = new Customer();
    c.setName("张三");
    c.setAge(20);

    // 集合中存在两个相同的 Customer
    list.add(c);
    list.add(c);

    // 转换成 json 的字符串
    String jsonString = JSON.toJSONString(list);
    System.out.println(jsonString);
    // 输出结果: [{"name":"张三","age":20},{"$ref":"$[0]"}]
    // 其中,第二个值是引用的第一个值; 如果将该 json 字符串发送到客户端,是无法解析的

    // 解决方案: 禁止循环的引用
String jsonString = JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonString);
// 输出结果: [{"name":"张三","age":20},{"name":"张三","age":20}]
}


// 存在问题二: 死循环

public class Person{
    private String pname;
    private Role role;

    get 和 set 方法
}

public class Role{
    private String rname;
    private Person person;

    get 和 set 方法
}

public void fun(){
    Person p = new Person();
    p.setPname("张三");
    Role r = new Role();
    r.setRname("管理员");

    p.setRole(r);
    r.setPerson(p);
String jsonString = JSON.toJSONString(p, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonString);
// 栈溢出异常;
}

// 解决方案:
public class Person{
    private String pname;

    // 添加注解, 表示该属性不转换成 json 字符串
    @JSONField(serialize=false)
    private Role role;

    get 和 set 方法
}

参考资料:

原文地址:https://www.cnblogs.com/linkworld/p/7639664.html