最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決json字符串序列化后的順序問題

 更新時間:2021年03月15日 14:15:17   作者:peng-peng-  
這篇文章主要介紹了解決json字符串序列化后的順序問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1、應(yīng)用場景:

如果項目中用到j(luò)son字符串轉(zhuǎn)為jsonObject的需求,并且,需要保證字符串的順序轉(zhuǎn)之前和轉(zhuǎn)成jsonObject之后輸出的結(jié)果完全一致??赡苡悬c繞口,下面舉一個應(yīng)用場景的例子。

在做項目的過程中,需要寫Junit單元測試,有一個方法如下:

 @Test
 @SuppressWarnings("unchecked")
 public void facilitySoftwareQueryByPageExample() throws Exception {
  facilitySoftwareRepository.deleteAll();
  FacilitySoftwareConfig facilitySoftware = createFacilitySoftware();
  facilitySoftwareRepository.save(facilitySoftware);
  String userId = "1";
  int pageNumber = 1;
  int pageSize = 5;
  String facilities = objectMapper.writeValueAsString(facilitySoftware);
  LinkedHashMap<String, Object> jsonMap = JSON.parseObject(facilities,LinkedHashMap.class, Feature.OrderedField);
  JSONArray jsonArray = new JSONArray();
  JSONObject jsonObject = new JSONObject(true);
  jsonObject.putAll(jsonMap);
  jsonArray.add(jsonObject);
  this.mockMvc
   .perform(get("/v1/facilitysoftware/userid/" + userId + "/page/" + pageNumber
     + "/pagesize/" + pageSize + ""))
   .andExpect(status().isOk()).andExpect(jsonPath("content",is(jsonArray)))
   .andExpect(jsonPath("totalPages", is(1)))
   .andExpect(jsonPath("totalElements", is(1)))
   .andExpect(jsonPath("last", is(true)))
   .andExpect(jsonPath("number", is(0)))
   .andExpect(jsonPath("size", is(5)))
   .andExpect(jsonPath("numberOfElements", is(1)))
   .andExpect(jsonPath("first", is(true)))
   .andDo(document("facilitySoftware-query-example"));
 }

例子就在這里:

.andExpect(status().isOk()).andExpect(jsonPath("content",is(jsonArray)))

大家應(yīng)該都能讀懂,這行代碼意思就是你用Api獲取到的json字符串和你定義的字符串是否一致,一致則該條件測試通過。

這里的比較不僅僅要求所有的key和value都相同,而且需要保證兩個json串的順序完全相同,才可以完成該條件的測試。

查了資料解決途徑過程如下:首先我們使用的是阿里的fastJson,需要引入fastJson的依賴,具體百度maven倉庫,注意這里盡量使用穩(wěn)定版本的較高版本。如 1.2.*

在解決問題過程中,遇到如下解決方案

1、在初始化json對象的時候加上參數(shù)true,這里不完全符合我們的需求,加上true之后,是讓json串按照key的hashcode排序。

可以自定義升序或者降序,因為解決不了該場景的問題。這里不贅述,自行百度。

JSONObject jsonObject = new JSONObject(true);

2、解決問題,代碼如下,第一個參數(shù)是需要轉(zhuǎn)換的json字符串。

LinkedHashMap<String, Object> jsonMap = JSON.parseObject(facilities,LinkedHashMap.class, Feature.OrderedField);
JSONArray jsonArray = new JSONArray();
  JSONObject jsonObject = new JSONObject(true);
  jsonObject.putAll(jsonMap);
  jsonArray.add(jsonObject);

補(bǔ)充:JSON 序列化key排序問題和序列化大小寫問題

1. JSON 序列化key排序問題(fastjson)

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;
//創(chuàng)建學(xué)生對象
Student student = new Student();
student.setName("小明");
student.setSex(1);
student.setAge(18);
//序列化 json key按字典排序
System.out.println(JSONObject.toJSONString(student ,SerializerFeature.MapSortField));
//過濾不要的key age
 System.out.println(JSONObject.toJSONString(student , new PropertyFilter() {
   public boolean apply(Object source, String name, Object value) {
    if ("age".equals(name)) {
     return false;
    }
    return true;
   }
  }, SerializerFeature.MapSortField));

2. JSON 序列化大小寫問題(fastjson)

//學(xué)生類
import com.alibaba.fastjson.annotation.JSONField;
public class Student {
 private String name;
 private Integer sex;
 private Integer age;
 @JSONField(name = "Name") //用于序列化成json,key Name
 public String getName() {
  return name;
 }
 @JSONField(name = "Name") 用于json(Name)反序列化成學(xué)生對象
 public void setName(String name) {
  this.name = name;
 }
 public Integer getSex() {
  return sex;
 }
 public void setSex(Integer sex) {
  this.sex = sex;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
}

3. jackson 序列化大小寫問題

@ResponseBody和@RequestBody中的序列化和反序列化就是用的jackson

 //學(xué)生類
import com.fasterxml.jackson.annotation.JsonProperty;
public class Student {
 @JsonProperty("Name")
 private String name;
 private Integer sex;
 private Integer age;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Integer getSex() {
  return sex;
 }
 public void setSex(Integer sex) {
  this.sex = sex;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
}
//自己測試下
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
@Test
public void test() throws Exception{
 Student student = new Student();
 student.setName("小明");
 ObjectMapper MAPPER = new ObjectMapper();
 //jackson序列化
 String json = MAPPER.writeValueAsString(student);
 System.out.println(json);
 //jackson反序列化
 Student student2 = MAPPER.readValue(json, Student.class);
 System.out.println(student2.getName());
}

4. jackson 序列化null值的問題

fastjson序列化默認(rèn)會去掉值為null的鍵值對

//在學(xué)生類上加上這個
方式一:(已經(jīng)過時的方法)
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
方式二:
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)

5. jackson 反序列化忽略多余的json字段

import com.fasterxml.jackson.databind.DeserializationFeature;
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

6. jackson 序列化忽略多余的json字段

方式一:
@JsonIgnoreProperties:該注解將在類曾級別上使用以忽略json屬性。在下面的栗子中,我們將從albums的dataset中忽略“tag”屬性;
@JsonIgnoreProperties({ "tags" })
方式二:
@JsonIgnore:該注釋將在屬性級別上使用以忽略特定屬性;get方法上
@JsonIgnore 

7. jackson 常用注解

@JsonAlias("Name")  反序列化時生效
private String name;
@JsonProperty("Name") 反序列化和序列化都時生效
private String name;

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java微服務(wù)的打包問題解決

    Java微服務(wù)的打包問題解決

    本文主要介紹了Java微服務(wù)的打包問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽

    IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽

    這篇文章主要介紹了IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Spring Boot Jar 文件能直接運行的操作方法

    Spring Boot Jar 文件能直接運行的操作方法

    本文將深入探討 Spring Boot 的打包過程及其運行原理,揭示其 JAR 文件如何巧妙地集成依賴項、嵌入 Web 容器并實現(xiàn)自動配置,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Spring LDAP目錄服務(wù)的使用示例

    Spring LDAP目錄服務(wù)的使用示例

    本文主要介紹了Spring LDAP目錄服務(wù)的使用示例
    2025-04-04
  • java 字符串池的深入理解

    java 字符串池的深入理解

    這篇文章主要介紹了java 字符串池的深入理解的相關(guān)資料,這里提供實例代碼幫助大家學(xué)習(xí)理解這部分內(nèi)容,希望大家能夠掌握,需要的朋友可以參考下
    2017-08-08
  • springboot讀取nacos配置文件的實現(xiàn)

    springboot讀取nacos配置文件的實現(xiàn)

    SpringBoot注冊服務(wù)到Nacos上,由Nacos來做服務(wù)的管理,本文主要介紹了springboot讀取nacos配置文件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 在Java中如何避免創(chuàng)建不必要的對象

    在Java中如何避免創(chuàng)建不必要的對象

    作為Java開發(fā)者,我們每天創(chuàng)建很多對象,但如何才能避免創(chuàng)建不必要的對象呢?這需要我們好好學(xué)習(xí),這篇文章主要給大家介紹了關(guān)于在Java中如何避免創(chuàng)建不必要對象的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 如何為Logback日志添加唯一追蹤ID

    如何為Logback日志添加唯一追蹤ID

    本文介紹了如何為Logback日志添加唯一追蹤ID,以便在測試和調(diào)試時更容易定位報錯信息,通過創(chuàng)建過濾器和修改配置文件,可以在每個請求的日志中添加唯一的ID,并將其返回給前端,這樣,當(dāng)用戶反饋報錯時,開發(fā)人員可以根據(jù)ID快速定位和解決問題
    2024-12-12
  • Spring??AOP的兩種使用方法

    Spring??AOP的兩種使用方法

    這篇文章主要介紹了Spring?AOP的兩種使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Spring中@Primary注解的作用詳解

    Spring中@Primary注解的作用詳解

    這篇文章主要介紹了Spring中@Primary注解的作用詳解,@Primary 注解是Spring框架中的一個注解,用于標(biāo)識一個Bean作為默認(rèn)的實現(xiàn)類,當(dāng)存在多個實現(xiàn)類時,通過使用@Primary注解,可以指定其中一個作為默認(rèn)的實現(xiàn)類,以便在注入時自動選擇該實現(xiàn)類,需要的朋友可以參考下
    2023-10-10

最新評論

大渡口区| 正安县| 呼图壁县| 石阡县| 明光市| 阜南县| 平远县| 沛县| 桓台县| 冷水江市| 襄垣县| 库车县| 阜南县| 富宁县| 桂林市| 洛隆县| 双流县| 平潭县| 繁峙县| 堆龙德庆县| 新绛县| 凯里市| 紫金县| 民丰县| 精河县| 高碑店市| 屯昌县| 达孜县| 石台县| 改则县| 衢州市| 洛浦县| 利津县| 西吉县| 大荔县| 长乐市| 利川市| 含山县| 黄梅县| 开鲁县| 胶州市|