1. 程式人生 > 實用技巧 >學習Json看著一篇就夠了

學習Json看著一篇就夠了

引言

在早期的web頁面中,如web1.0時代,比如一個登陸頁面需要重新整理頁面才能重新登陸,不點選登入頁面就不知道自己密碼輸錯了.再舉個栗子,去百度輸入1,再輸入2,不用重新整理是否下面的頁面也會跟著改變,而且頁面沒有重新整理.現在大多樹的網站都是區域性重新整理,不重新整理整個頁面的情況下,實現頁面重新整理;


web2.0時代,最重要的一個因素就是Ajax,而其中的傳輸資料就是Json資料


什麼是Json?

JSON(JavaScript Object Notation.JS物件標記)是一種輕量級的資料交換格式,目前使用特別廣泛.

採用完全獨立變成語言的文字格式來儲存和表示資料.簡介和清晰的層次結構鋼使得JSON成為理想的資料交換語言.抑鬱人閱讀和編寫,同時也抑鬱機器解析和生成,並有效地提升網路傳輸效率

這是他的logo

在JS語言中,一切都是物件.因此,任何支援的型別都可以通過JSON來表示,例如字串,數字,物件,陣列等

格式要求

  • 物件表示為鍵值對
  • 資料由括號分隔
  • 花括號儲存物件
  • 方括號儲存陣列
    JSON鍵值對是用來儲存JS物件的一種方式.和JS物件的寫法也大同小異,鍵/值對組合中的簡明在前面用雙引號""包裹,使用冒號:分割然後緊接著值:
{"name":"ChouGouShi"}
{"age":"3"}
{"sex":"男"}

很多人搞不清楚JSON和JS物件的關係,甚至連誰是誰都不清楚.其實,可以這麼理解:
JSON是JS物件的字串表示法,它使用文字表示一個JS物件的資訊,本質是一個字串.

首先看一下物件和JSON的差異

var obj = {a: 'hello',b: 'shit!'};//這是一個物件,注意簡明也是可以使用引號包裹的
var json = '{"a": "hello","b": "shit!"}';//這是一個JSON字串,本質是一個字串

JSON和JS物件互相轉換(後面有JAVA物件互轉,別急)

要實現JSON字串轉換為JS物件,使用JSON.parse()方法:

var obj = JSON.parse('{"a": "hello","b": "shit!"}') //fu

要實現JS物件轉換成JSON字串,使用Json.stringify()方法:

var json = JSON.stringifg({a: 'hello',b: 'shit!'})

對應頁面程式碼,然後在頁面f12檢視一下吧

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<script type="text/javascript">
  //編寫一個物件
  var user = {
  name:"臭狗屎",
        age:2,
        sex:"男"
  }
  console.log(user); //輸出這個物件
    var str = JSON.stringify(user); //轉換成json
    console.log(str); //輸出轉換後的物件
    var str1 = JSON.parse(str); //再將轉換後的物件轉換成物件
    console.log(str1) //輸出物件
</script>

</body>
</html>
</pre>

Java物件與Json的互相轉換

首先我們要知道要實現頁面無重新整理,從Controller返回的response請求就不能經過檢視解析器了,想要實現這個,就要在Controller類加上一個@ResponseBody註解這個註解的作用就是返回前端資料的時候不返回真個頁面而是一串資料
(記住使用這個註解的時候需要新增對應依賴)

實現Json

市面上有很多第三方的jar包可以實現這個功能,jackson.只需要一個簡單的註解就可以實現了
下面是使用方法

/*
* 這裡我沒有用Springboot,建立的是一個web專案,所以懶得弄web的配置了,程式碼沒問題偶
*/
@Controller
public class Spring {
  @RequestMapping("/json1")
  @ResponseBody
  public String json1() throws JsonProcessingException{ //注意這裡將異常丟擲了
      ObjectMapper mapper = new ObjectMapper(); //jackson下的物件,jackson的物件對映器,就是一個類,使用它可以直接將物件轉換成json字串
      //建立一個物件
      User user = new User("臭狗屎",22,1234);
      System.out.println(user);
      String s = mapper.writeValueAsString(user);//轉就完事了
      System.out.println(s);
      return s;
    }
}
@Data
@AllArgsConstructor
class User{
  private String name;
    private int id;
    private int tel;
}

重要的地方!簡化程式碼

這裡大家別看程式碼量為何如此龐大,並不簡單,簡化後的程式碼如下

@RequestMapping(value="/json2",produces="application/json;charset=utf-8") //這裡是為了解決頁面中的中文亂按問題
@ResponseBody
public String json2() throws JsonProcessingException{
    User user = new User("臭狗屎2號",1,1324); //其實這裡也不需要,真正應用的時候會直接傳引數過來
    return new ObjectMapper().writeValueAsString(user);
}

Json中的集合

@RequestMapping(value="/json3",produces="application/json;charset=utf-8") //這裡是為了解決頁面中的中文亂按問題
@ResponseBody
public String json3() throws JsonProcessingException{
  List userList = new ArrayList();
    User user1 = new User("臭狗屎1號",1,1324);
    User user2 = new User("臭狗屎2號",1,1324);
    User user3 = new User("臭狗屎3號",1,1324);
    User user4 = new User("臭狗屎4號",1,1324);
    User user5 = new User("臭狗屎5號",1,1324);
    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);
    userList.add(user5);
    return new ObjectMapper().writeValueAsString(userList);
}

jackson中時間格式化問題(不看後悔)

當我在進行日期格式化的時候出現了這麼一個錯誤

@Test
public void json4() throws JsonProcessingException{
  Date date = new Date();
    System.out.println(date);
    System.out.println( new ObjectMapper().writeValueAsString(date));
}

輸出是這樣的

Tue Sep 01 19:19:00 CST 2020
1598959140949

不覺得奇怪嗎,明明是上面的格式,Json後竟然變成這個吊樣
後來官網給了我答案

@Test
public void json5() throws JsonProcessingException{
  ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);//就是這句,將時間型別轉換成時間戳關閉即可
  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //自定義日期格式
  mapper.setDateFormat(simpleDateFormat);//讓mapper的指定格式為此
  Date date = new Date();
    System.out.println(date);
    System.out.println( new ObjectMapper().writeValueAsString(date));
}


來自為知筆記(Wiz)