一、JSON是什么?

JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。

JSON就是一串字符串 只不过元素会使用特定的符号标注。

存储结构是 KEY-VALUE
key为string类型
value为: String   Boolean   Number  数组   Object    null

 [] 中括号代表的是一个数组;
 {} 大括号代表的是一个对象
 "" 双引号表示的是属性值
:冒号代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

"格式完好"的JSON,就是要求指定的字符串必须符合严格的JSON格式,属性名称必须加双引号、字符串值也必须用双引号。例如:

{
 "name": "teacher",     
 "computer": {
     "CPU": "intel7",
     "disk": "512G"
     },
 "students": [
     {
     "name": "张三",
     "age": 18,
     "sex": true
     },
     {
     "name": "李四",
     "age": 19,
     "sex": false
     }
     ]
 }二、JS

ON生成以及解析

java两个双引号json json 双引号_List

我们经常用到的是实体类转换成JSONObject对象,以及解析JSON;

(1)四种实体类生成Json字符串

public void EntityToJson() throws IOException {
    Person person = new Person("张三", "男", 25);
    //1、利用传统方式
JSONObject jsonObject = new JSONObject(); 
    jsonObject.put("name", person .getName());  
    jsonObject.put("sex", person .getSex());    
    jsonObject.put("age", person .getAge());
jsonObject.toString());
    //2、利用Jackson方式
 ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValueAsString(person);
    //3、利用GSON方式
Gson gson = new Gson();
gson.toJson(person);
    //4、利用FastJSON方式
 Object jsonString = JSON.toJSON(person);
     System.out.println(jsonString.toString());
}

(2)Json字符串生成实体类

JSON解析一定要掌握的两条规则:

  • 1.如果看到是{ }–>使用JSONObject
  • 2.如果看到的[ ]–>使用JSONArray解析
public void JsonToEntity(){    
String jsonString = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":25}";  
  //1、利用传统方式
JSONObject jsonObject = new JSONObject(jsonString);  
jsonObject.get("name").toString(), jsonObject.get("sex").toString(), Integer.valueOf(jsonObject.get("age").toString()));    
//2、利用Jackson方式
 ObjectMapper objectMapper = new ObjectMapper();   
objectMapper.readValue(jsonString, Person.class);
//3、利用GSON方式
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
//4、利用FastJSON方式
Person person = JSON.parseObject(jsonString, Person.class);
}
另外:对于数组来说GSON和FastJSON各有自己的解析方式;详细方法参照API;
List<String> list =gson.fromJson(json2, new TypeToken<List<String>>(){}.getType());
List<Person > person List =gson.fromJson(json3, new TypeToken<List<Person >>(){}.getType());
List<String> list = JSON.parseArray(json2, String.class);
List<Person > userList = JSON.parseArray(json3, Person .class);

(3)根据JSON建立对象

{
     "desc": "OK",
     "status": 1000,
     "data": {
         "wendu": "20",
         "ganmao": "相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。",
         "forecast": [
             {
                 "fengxiang": "北风",
                 "fengli": "3-4级",
                 "high": "高温 27℃",
                 "type": "中雨",
                 "low": "低温 19℃",
                 "date": "6日星期五"
             },
             {
                 "fengxiang": "北风",
                 "fengli": "微风级",
                 "high": "高温 23℃",
                 "type": "大雨",
                 "low": "低温 17℃",
                 "date": "7日星期六"
             },
             {
                 "fengxiang": "北风",
                 "fengli": "微风级",
                 "high": "高温 26℃",
                 "type": "小雨",
                 "low": "低温 17℃",
                 "date": "8日星期天"
             },
             {
                 "fengxiang": "南风",
                 "fengli": "微风级",
                 "high": "高温 27℃",
                 "type": "多云",
                 "low": "低温 15℃",
                 "date": "9日星期一"
             },
             {
                 "fengxiang": "南风",
                 "fengli": "微风级",
                 "high": "高温 29℃",
                 "type": "多云",
                 "low": "低温 16℃",
                 "date": "10日星期二"
             }
         ],
         "yesterday": {
             "fl": "微风",
             "fx": "北风",
             "high": "高温 33℃",
             "type": "阴",
             "low": "低温 22℃",
             "date": "5日星期四"
         },
         "aqi": "58",
         "city": "成都"
     }
 }

数据略大,不方便看,这里给大家提供一个JSON在线解析工具http://www.bejson.com/count.html 自动格式化,方便观看。

java两个双引号json json 双引号_List_02

分析:

    一:   第一个大括号(JSONObject){”desc”: “status”: “data”} 
    二:data里面有一个大括号(JSONObject){”wendu”  , “ganmao”,  “forecast”, “yesterday”,   “aqi”,  “city” } 
    三:第二个大括号里面有两个对象 1.数组形“forecast”(JSONArray) 2.对象形“yesterday”( JSONObject ) 
    而数组形里面又套有数组的对象{}
 

开始封装字段:

import java.util.List;
/**
  * 对应的字段的封装
  */
 public class Weather {
 //  外面大括号的字段封装 setter getter toString
     public String desc;
     public int status;
     public Data data;
     @Override
     public String toString() {
         return "Weather [desc=" + desc + ", status=" + status + ", data="
                 + data + "]";
     }
 }class Data{
 //  里面大括号的字段封装 setter getter toString 
 //  该类中包含有数组形和对象形,需要一并的封装在里面
     public String wendu;
     public String ganmao;
     public List<Forecast> forecast;
     public Yesterday yesterday;
     public String aqi;
     public String city;
     @Override
     public String toString() {
         return "Data [wendu=" + wendu + ", ganmao=" + ganmao + ", forecast="
                 + forecast + ", yesterday=" + yesterday + ", aqi=" + aqi
                 + ", city=" + city + "]";
     }
 }class Forecast{
 //  数组里面的大括号类型字段的封装
     public String fengxiang;
     public String fengli;
     public String high;
     public String type; 
     public String low;
     public String date;
     @Override
     public String toString() {
         return "Forecast [fengxiang=" + fengxiang + ", fengli=" + fengli
                 + ", high=" + high + ", type=" + type + ", low=" + low
                 + ", date=" + date + "]";
     }
 }
 class Yesterday{
 //   最后{}的字段封装
     public String fl;
     public String fx;
     public String high;
     public String type;
     public String low;
     public String date;
     @Override
     public String toString() {
         return "Yesterday [fl=" + fl + ", fx=" + fx + ", high=" + high
                 + ", type=" + type + ", low=" + low + ", date=" + date + "]";
     }}

将数据封装成json格式

json有两种格式:
(1)对象格式:   JSONObject.fromObject
{“key1”:obj,”key2”:obj,”key3”:obj…}

1、Map集合

Map map = new HashMap();
 map.put("name", "json");
 map.put("bool", Boolean.TRUE);
 map.put("int", new Integer(1));
 map.put("arr", new String[] { "a", "b" });
 JSONObject json = JSONObject.fromObject(map);
 ————————————————2、Bean
JSONObject jsonObject = JSONObject.fromObject(new JsonBean());
————————————————
(2)数组/集合格式:   JSONArray.fromObject
[obj,obj,obj…]1、数组
boolean[] boolArray = new boolean[] { true, false, true };
 JSONArray jsonArray1 = JSONArray.fromObject(boolArray);————————————————
2、一般数据
JSONArray jsonArray2 = JSONArray.fromObject("['json','is','easy']" );
————————————————
3、List集合
List list = new ArrayList();
 list.add( "first" );
 list.add( "second" );
 JSONArray jsonArray3 = JSONArray.fromObject( list );
 ————————————————