JSON入门

什么是json?为什么用json?

json是一种采用文本方式表示数据的方法!  请注意这里最重要的就是这个  文本方式表示数据的  文本是及其重要的!!

原因是 文本是  计算机里面非常普遍 非常普遍的, 在说一下, 非常普遍的方式, 普遍到, 你随便找个计算机就可以有文本查看,和编辑的工具, 这样 就非常方便的  查看,编辑 json的文本了, 便于调试、开发、修改等等!

及其重要的, 无论您水平多高, 程序都可能有bug的, 因此若是一个程序出了问题是  读取或者操作的数据有问题, 还是程序问题?   这样json的普通程序都可以查看的  特点为我们调试程序带来了福音!!

另外json除了普通外, 还有强大, 从文本数据, 二进制数据,流量流, 图片,声音等等, 只要你能搞到内存中, 就可以用json来表示, 你看人家支持byte[] 数据的, 因此只要你能变为byte[] 就能变为json,并且是文本!!

好了, 下面是网络上介绍json的两个资料整理到这里了, 大家有空慢慢看吧。

什么是JSON

JSON:JavaScript Object Notation 【JavaScript 对象表示法】

JSON 是存储和交换文本信息的语法。类似 XML。

JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S

 

为什么需要JSON

提到JSON,我们就应该和XML来进行对比。XML也是一种存储和交换文本信息的手段。那么JSON好在哪里呢??

JSON 比 XML 更小、更快,更易解析

  • javaScript原生支持JSON,解析速度会很快
  • XML解析成DOM对象的时候,浏览器【IE和fireFox】会有差异
  • 使用JSON会更简单

更加容易创建JavaScript对象

var p = {'city':['北京','上海','广州','深圳']};
for(var i=0;i<p.city.length;i++){
	document.write(p.city[i]+"<br/>");
}

 

JSON语法

客户端与服务端的交互数据无非就是两种

  • 数组
  • 对象

于是乎,JSON所表示的数据要么就是对象,要么就是数组

JSON语法是javaScript语法的子集,javaScript用[]中括号来表示数组,用{}大括号来表示对象,JSON亦是如此

 

JSON数组:


	var employees = [
	{ "firstName":"Bill" , "lastName":"Gates" },
	{ "firstName":"George" , "lastName":"Bush" },
	{ "firstName":"Thomas" , "lastName": "Carter" }
	];

 

JSON对象


        var obj = {

            age: 20,
            str: "zhongfucheng",
            method: function () {
                alert("我爱学习");
            }

        };

当然啦,数组可以包含对象,在对象中也可以包含数组

 

解析JSON

javaScript原生支持JSON的,我们可以使用eval()函数来解析JSON,把JSON文本数据转换成一个JavaScript对象。

        function test() {
			//在写JOSN的时候,记得把带上逗号
            var txt = "{a:123," +
                    "b:'zhongfucheng'}";

            //使用eval解析JSON字符串,需要增添()
            var aa = eval("(" + txt + ")");
            alert(aa);

        }

评论区提醒:JSON解析应该使用:JSON.parse。基于安全问题(防止不安全代码执行)应该优先使用JSON.parse而不是eval。

 

效果

这里写图片描述

 

 

不用框架时将JavaBean转成JSON

  • 使用Strus2的时候,Struts2自带了组件能够让JavaBean对象、集合转成是JSON,不用我们自己拼接...这是非常方便的。
  • 使用SpringMVC的时候,SpringMVC也支持将JavaBean转成JSON

但是,我们不一定使用框架来做开发呀。因此,我们还得学习使用第三方库来将JavaBean对象、集合转成JSON

 

导入开发包

  • commons-io-2.0.1.jar
  • commons-lang-2.5.jar
  • commons-collections-3.1.jar
  • commons-beanutils-1.7.0.jar
  • ezmorph-1.0.3.jar
  • json-lib-2.1-jdk15.jar

 

事例代码

注意, 原文中代码,jar已经不好下载, 下载后工作不正常, 因此采用fastjson重新做了代码, 另外补充一些类

另外:  
http://www.bejson.com/ 在线的 json 格式化工具
http://www.bejson.com/json2javapojo/new/ json 转 java bean类

------------
package cn.iigrowing.study.json.demo1;

public class City {
 public int id;
 public String name;
 public City(int id, String name) {
 super();
 this.id = id;
 this.name = name;
 }
 
 public City() {
 super();
 }
}
-----
package cn.iigrowing.study.json.demo1;

import java.util.List;

public class Province {
 public int id;
 public String name;
 List<City> citys;
 public Province(int id, String name, List<City> citys) {
 super();
 this.id = id;
 this.name = name;
 this.citys = citys;
 }
 
 public Province() {
 super();
 this.id = id;
 this.name = name;
 this.citys = citys;
 }
}
---------------
package cn.iigrowing.study.json.demo1;

//import net.sf.json.JSON;
//import net.sf.json.JSONArray;

import java.util.*;

import org.json.JSONArray;

import com.alibaba.fastjson.JSON;

/**
 * 使用第三方工具,将JavaBean对象/List或Set或Map对象转成JSON
 * 
 * @author AdminTC
 */
public class TestBean2Json {
 
 private static void javabean2json() {
 City city = new City(1, "广州");
 
// JSONArray
// JSONArray jSONArray = JSONArray.fromObject(city);
// String jsonJAVA = jSONArray.toString();
 
 String jsonString = JSON.toJSONString(city); 
 System.out.println(jsonString);
 // [{"id":1,"name":"广州"}]
 }

 private static void list2json() {
 List<City> cityList = new ArrayList<City>();
 cityList.add(new City(1, "广州"));
 cityList.add(new City(2, "珠海"));
 String jsonString = JSON.toJSONString(cityList); 
 // JSONArray jSONArray = JSONArray.fromObject(cityList);
 // String jsonJAVA = jSONArray.toString();
 System.out.println(jsonString);
 // [{"id":1,"name":"广州"},{"id":2,"name":"珠海"}]
 }

 private static void set2json() {
 Set<City> citySet = new LinkedHashSet<City>();
 citySet.add(new City(1, "广州"));
 citySet.add(new City(2, "珠海"));
 String jsonString = JSON.toJSONString(citySet); 
// JSONArray jSONArray = JSONArray.fromObject(citySet);
// String jsonJAVA = jSONArray.toString();
 System.out.println(jsonString);
 // [{"id":1,"name":"广州"},{"id":2,"name":"珠海"}]
 }

 private static void javabeanlist2json() {
 List<City> cityList = new ArrayList<City>();
 cityList.add(new City(1, "中山"));
 cityList.add(new City(2, "佛山"));
 Province province = new Province(1, "广东", cityList);
 String jsonString = JSON.toJSONString(province); 
// JSONArray jSONArray = JSONArray.fromObject(province);
// String jsonJAVA = jSONArray.toString();
 System.out.println(jsonString);
 /*
 * [ { "id":1, "name":"广东"
 * "cityList":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}], } ]
 */
 }

 private static void map2json() {

 List<City> cityList = new ArrayList<City>();
 cityList.add(new City(1, "中山"));
 cityList.add(new City(2, "佛山"));

 Map<String, Object> map = new LinkedHashMap<String, Object>();
 map.put("total", cityList.size());// 表示集合的长度
 map.put("rows", cityList);// rows表示集合

 String jsonString = JSON.toJSONString(map); 
// JSONArray jSONArray = JSONArray.fromObject(map);
// String jsonJAVA = jSONArray.toString();
 System.out.println(jsonString);
 // [{"total":2,"rows":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}]}]

// jsonJAVA = jsonJAVA.substring(1, jsonJAVA.length() - 1);
// System.out.println(jsonJAVA);
 }
 
 public static void main(String[] args)
 {
 javabean2json();
 list2json();
 set2json();
 javabeanlist2json();
 map2json();
 
// {"id":1,"name":"广州"}
// [{"id":1,"name":"广州"},{"id":2,"name":"珠海"}]
// [{"id":1,"name":"广州"},{"id":2,"name":"珠海"}]
// {"id":1,"name":"广东"}
// {"total":2,"rows":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}]}
 }

}

-----------

把要解析成JSON 的javaBena对象、集合放进下面这段代码即可!

		JSONArray jSONArray = JSONArray.fromObject(map);

无论放进去什么,返回的都是数组

 

总结

 

来源: https://my.oschina.net/u/3777556/blog/1621699

另外一个介绍json的如下,也非常好:

JSON快速入门(Java版)

一、JSON简介

1、什么是JSON

JSON是行业使用广泛的一种数据格式。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。简单地说,JSON可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是JavaScript很容易解释它,而且 JSON 可以表示比 "名称 / 值对" 更复杂的结构。
总结什么是 JSON ?
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation);
JSON 是轻量级的文本数据交换格式
JSON 独立于语言 *
JSON 具有自我描述性,更易理解。
* JSON 使用 JavaScript 语法来描述数据对象(JSON 语法是 JavaScript 对象表示法语法的子集),但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON的优点:易于人的阅读和编写,方便程序解析与生成。

2、JSON语法结构

标准的JSON数据表示
数据结构
Object:使用花括号 {} 包含的键值对结构,key必须是string类型,value为任何基本类型或数据结构,逗号分隔数据。
Array:使用中括号 [] 来表示,并用逗号来分隔元素。
基本类型:string、number、true、false、null。
简单实例(first.json)

{
    "name" : "张三",
    "age" : 25,
    "birthday" : "1994-12-12",
    "school" : "西安电子科技大学",
    "major" : ["Java", "C++"],
    "has_house" : false,
    "house" : null,
    "car" : {
        "sign" : "奔驰",
        "model" : "SUV"
    },

    "comment" : "标准JSON里面没有注释"
}

二、使用Java操作JSON

使用Java操作JSON可以使用org.json包(Android SDK中使用的JSON官方库),在JSON的官网:http://www.json.org/ 中可以找到。使用Maven项目则添加如下依赖即可:

<dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
</dependency>

1、创建JSON对象的几种方式

import java.util.HashMap;
import java.util.Map;

import org.json.JSONObject;

import com.zxt.demo.Car;
import com.zxt.demo.Person;

public class JSONObjectTest {
    
    public static void main(String[] args) {
        jSONObject();
        creatJsonByMap();
        creatJsonByBean();
    }

    /**
     * @Description:使用JSONObject来构建JSON对象
     */
    private static void jSONObject() {
        // 创建一个JSONObject对象
        JSONObject zhangsan = new JSONObject();
        Object nullObj = null;
        
        zhangsan.put("name", "张三");
        zhangsan.put("age", 25);
        zhangsan.put("birthday", "1994-12-12");
        zhangsan.put("school", "西安电子科技大学");
        zhangsan.put("major", new String[] {"Java", "C++"});
        zhangsan.put("has_house", false);
        zhangsan.put("house", nullObj);
        JSONObject car = new JSONObject();
        car.put("sign", "奔驰");
        car.put("model", "SUV");
        zhangsan.put("car", car);
        zhangsan.put("comment", "标准JSON里面没有注释");
        
        // print
        System.out.println(zhangsan.toString());
    }
    
    /**
     * @Description:使用Map来构建JSON对象
     */
    private static void creatJsonByMap() {
        Map<String, Object> zhangsan = new HashMap<String, Object>();
        
        zhangsan.put("name", "张三");
        zhangsan.put("age", 25);
        zhangsan.put("birthday", "1994-12-12");
        zhangsan.put("school", "西安电子科技大学");
        zhangsan.put("major", new String[] {"Java", "C++"});
        zhangsan.put("has_house", false);
        zhangsan.put("house", null);
        Map<String, Object> car = new HashMap<String, Object>();
        car.put("sign", "奔驰");
        car.put("model", "SUV");
        zhangsan.put("car", car);
        zhangsan.put("comment", "标准JSON里面没有注释");
        
        // JSONObject支持使用Map对象直接构造JSON对象
        System.out.println(new JSONObject(zhangsan));
    }
    
    /**
     * @Description:使用Java Bean对象来构建JSON对象 (推荐使用的方式)
     */
    private static void creatJsonByBean() {
        Person zhangsan = new Person();
        zhangsan.setName("张三");
        zhangsan.setAge(25);
        zhangsan.setBirthday("1994-12-12");
        zhangsan.setSchool("西安电子科技大学");
        zhangsan.setMajor(new String[] {"Java", "C++"});
        zhangsan.setHas_house(false);
        zhangsan.setHouse(null);
        zhangsan.setCar(new Car("奔驰", "SUV"));
        zhangsan.setComment("标准JSON里面没有注释");
        
        // JSONObject支持使用Java Bean对象直接构造JSON对象
        System.out.println(new JSONObject(zhangsan));
    }
}

2、从json文件中读取JSON对象

1)、首先引入commons-io的依赖,以便方便读取文件

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
</dependency>

2)、读取json文件,并操作JSON对象

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;

public class ReadJSONTest {

    public static void main(String[] args) {
        File file = new File(ReadJSONTest.class.getResource("/zhangsan.json").getFile());
        try {
            String content = FileUtils.readFileToString(file);
            JSONObject jsonObject = new JSONObject(content);
            System.out.println(jsonObject);

            // 一般来说需要先对要获取的属性进行判空操作,防止异常发生
            if (!jsonObject.isNull("name")) {
                System.out.println("姓名是:" + jsonObject.getString("name"));
            }
            System.out.println("年龄是:" + jsonObject.getInt("age"));
            System.out.println("是否有房子:" + jsonObject.getBoolean("has_house"));
            System.out.println("汽车:" + jsonObject.getJSONObject("car"));
            JSONArray jsonArray = jsonObject.getJSONArray("major");
            for (Object str : jsonArray) {
                System.out.println("专业:" + str);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、GSON介绍

org.json包进行JSON对象的创建与操作(JSONObject),具有两个缺点:
1、没有日期类型;
2、可以由Java Bean对象生成JSON对象,但是无法通过JSON对象反解析出Java Bean对象。
这里介绍一种更强大的Java 处理JSON数据的包,gson(Gson)。

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
</dependency>

1、创建JSON对象

import com.google.gson.annotations.SerializedName;

public class Person {
    @SerializedName("myname")
    private String name;
    private Integer age;
    private String birthday;
    private String school;
    // 使用Gson进行解析时,这里可以直接换成Java的集合类,list、set等,Gson可以直接解析出来
    private String[] major;
    private boolean has_house;
    private String house;
    private Car car;
    private String comment;
    
    // 有些属性不需要转换为JSON的key,则声明变量时添加 transient
    private transient String ignore;
    
    // 此处省略了一系列set和get方法

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", birthday=" + birthday + ", school=" + school + ", major="
                + Arrays.toString(major) + ", has_house=" + has_house + ", house=" + house + ", car=" + car
                + ", comment=" + comment + "]";
    }
}
import java.lang.reflect.Field;

import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.zxt.demo.Car;
import com.zxt.demo.Person;

public class GsonTest {

    public static void main(String[] args) {
        Person zhangsan = new Person();
        zhangsan.setName("张三");
        zhangsan.setAge(25);
        zhangsan.setBirthday("1994-12-12");
        zhangsan.setSchool("西安电子科技大学");
        zhangsan.setMajor(new String[] {"Java", "C++"});
        zhangsan.setHas_house(false);
        zhangsan.setHouse(null);
        zhangsan.setCar(new Car("奔驰", "SUV"));
        zhangsan.setComment("标准JSON里面没有注释");
        /**
         * Java Bean中的有些属性不需要转换为JSON的key,则声明变量时添加 transient
         */
        zhangsan.setIgnore("不要看见我");
        
        /**
         * 若不做处理,则生成的JSON对象的key就是Java Bean对象的属性名
         * Gson可以通过在Java Bean对象的属性上面使用 @SerializedName("")注解, 来设置生成的JSON的key名称
         * org.json包中的JSONObject则没有这个功能,无法修改生成的JSON对象key名称
         */
        // Gson gson = new Gson();
        
        /**
         * 使用GsonBuilder来生成JSON对象,可以拥有更多操作
         */
        GsonBuilder gsonBuilder = new GsonBuilder();
        // 格式化输出
        gsonBuilder.setPrettyPrinting();
        // 更改JSON对象key的名称
        gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() {
            
            @Override
            public String translateName(Field field) {
                if(field.getName().equals("age")) {
                    return "myage";
                }
                return field.getName();
            }
        });
        Gson gson = gsonBuilder.create();
        System.out.println(gson.toJson(zhangsan));
    }
}

2、解析JSON对象

使用GSON解析JSON对象时,可以把JSON对象直接转换成Java Bean对象,不仅如此GSON还支持Java Bean的Date属性的数据的解析。并且数组类型的属性可以直接使用Java的集合类表示,GSON也可以方便地解析出来。

JSON解析成Java Bean对象

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.google.gson.Gson;
import com.zxt.demo.Person;
import com.zxt.json.ReadJSONTest;

public class ReadGsonTest {

    public static void main(String[] args) {
        File file = new File(ReadJSONTest.class.getResource("/zhangsan.json").getFile());
        try {
            String content = FileUtils.readFileToString(file);
            Gson gson = new Gson();
            // Gson可以直接由JSON字符串解析为Java Bena对象,JSONObject没有这个功能
            Person person = gson.fromJson(content, Person.class);
            System.out.println(person);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

GSON解析成带有日期格式的Java Bean对象

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.zxt.demo.PersonWithBirthday;
import com.zxt.json.ReadJSONTest;

public class ReadGsonWithDataTest {

    public static void main(String[] args) {
        File file = new File(ReadJSONTest.class.getResource("/zhangsan.json").getFile());
        try {
            String content = FileUtils.readFileToString(file);
            GsonBuilder gsonBuilder = new GsonBuilder();
            // 设置日期解析格式
            gsonBuilder.setDateFormat("yyyy-MM-dd");
            Gson gson = gsonBuilder.create();
            PersonWithBirthday person = gson.fromJson(content, PersonWithBirthday.class);
            System.out.println(person);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

https://www.jianshu.com/p/4449e828a1ee

本文中参考代码如下:   MyJsonTest