Estrutura de processamento de dados JSON, Jackson explicou o primeiro uso de núcleo de serialização e desserialização parcial

Jackson é a estrutura de processamento de dados JSON padrão do Spring Boot, mas não depende de nenhuma biblioteca Spring. Alguns amigos pensam que Jackson só pode ser usado no framework Spring, mas não é. Não existe essa restrição. Ele fornece muitos métodos e anotações de processamento de dados JSON , bem como funções como API de streaming, modelo de árvore, vinculação de dados e conversão de tipo de dados complexo. Embora seja simples e fácil de usar, definitivamente não é um brinquedo pequeno. Esta seção apresenta o uso básico do Jackson. Escreverei uma série de 5 a 10 artigos para obter mais conteúdo. Continue prestando atenção em mim .

1. Preparação básica

A introdução do jar a seguir em qualquer projeto pode usar o jackson para realizar a serialização e desserialização de dados JSON.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

Escreva uma classe de entidade PlayerStar. A classe de entidade reflete principalmente o nome, idade, hobbies, amigos, renda anual e outras informações do astro do basquete. Para demonstrar as funções de serialização e desserialização de Jackson, tanto quanto possível, a matriz, Lista e Map estão todos integrados a esta classe. E inicialize o objeto da estrela do basquete Jordan por meio de getInstance.

@Data
public class PlayerStar {

  private String name;
  private Integer age;
  private String[] hobbies;    //业余爱好,数组
  private List<String> friends;   //  朋友
  private Map<String, BigDecimal> salary; //年收入 Map


  //初始化一个对象用于测试
  public static PlayerStar getInstance(){
    PlayerStar playerStar = new PlayerStar();

    playerStar.setName("乔丹");
    playerStar.setAge(45);
    playerStar.setHobbies(new String[]{"高尔夫球", "棒球"});
    Map<String, BigDecimal> salary = new HashMap<String, BigDecimal>() {
   
   {
      put("2000", new BigDecimal(10000000));
      put("2010", new BigDecimal(62000000));
      put("2020", new BigDecimal(112400000));
    }};
    playerStar.setSalary(salary);
    playerStar.setFriends(Arrays.asList("kobe", "curry", "james"));

    return playerStar;
  }

}

Dois, método de serialização

O código a seguir demonstra como serializar o objeto PlayerStar em uma string JSON.

  • writeValue pode receber File como um parâmetro e salvar o resultado da serialização JSON em um arquivo
  • writeValueAsString retorna o resultado da serialização JSON no formato de String
  • O método writerWithDefaultPrettyPrinter pode formatar o resultado da serialização JSON, que possui uma estrutura de exibição melhor e é fácil de visualizar
@Test
void testObject2JSON() throws IOException {
  //获取对象实例
  PlayerStar player = PlayerStar.getInstance();

  //ObjectMapper作为Jackson的API工具类存在
  ObjectMapper mapper = new ObjectMapper();
  //将player对象以JSON格式进行序列化,并将序列化结果写入文件
  mapper.writeValue(new File("d:\\data\\jackson\\player.json"), player);

  //将player对象以JSON格式进行序列化为String对象
  String jsonString = mapper.writeValueAsString(player);
  System.out.println(jsonString);

  //将player对象以JSON格式进行序列化为String对象(格式美化)
  String jsonInString2 = mapper.writerWithDefaultPrettyPrinter()
          .writeValueAsString(player);
  System.out.println(jsonInString2);
}

A saída de impressão do console de jsonString também é o conteúdo do arquivo d: \ data \ jackson \ player.json


{"name":"乔丹","age":45,"hobbies":["高尔夫球","棒球"],"friends":["kobe","curry","james"],"salary":{"2000":10000000,"2010":62000000,"2020":112400000}}

A saída de impressão do console de jsonString2, o formato é embelezado, porque o método writerWithDefaultPrettyPrinter () é usado

{
  "name" : "乔丹",
  "age" : 45,
  "hobbies" : [ "高尔夫球", "棒球" ],
  "friends" : [ "kobe", "curry", "james" ],
  "salary" : {
    "2000" : 10000000,
    "2010" : 62000000,
    "2020" : 112400000
  }
}

Três, método de desserialização

O código a seguir demonstra como desserializar uma string JSON em um objeto Java

@Test
void testJSON2Object() throws IOException {
  ObjectMapper mapper = new ObjectMapper();
  //从文件中读取JSON字符串,反序列化为java对象
  PlayerStar player = mapper.readValue(new File("d:\\data\\jackson\\player.json"), PlayerStar.class);
  System.out.println(player);

  //将JSON字符串反序列化为java对象
  String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
  PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class);

  System.out.println(jordan);

}

A saída do console do objeto PlayerStar é a seguinte ( observe que a saída aqui não está no formato JSON, mas o valor do método toString () do objeto java ):

PlayerStar(name=乔丹, age=45, hobbies=[高尔夫球, 棒球], friends=[kobe, curry, james], salary={2000=10000000, 2010=62000000, 2020=112400000})
PlayerStar(name=乔丹, age=45, hobbies=[高尔夫球, 棒球], friends=null, salary=null)

Quatro, renomeação de campo@JsonProperty

Você pode usar @JsonProperty para influenciar a renomeação de propriedades de objetos serializados e desserializados.

@Data
public class PlayerStar {

  @JsonProperty("playerName")
  private String name;  //将属性name序列化为playerName,同时影响反序列化

Depois de usar a anotação do código acima, o atributo name do resultado da serialização JSON torna-se o atributo playerName

{"playerName":"乔丹"  ……

Ao mesmo tempo, afeta a desserialização.O seguinte código de desserialização relatará um erro porque o atributo name é usado. PlayerName deve ser usado.

String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class);

Quinto, ignore a serialização de campos nulos@JsonInclude

Quando não atribuímos valores às variáveis ​​de membro do objeto, por padrão, o resultado de serialização de Jackson é o seguinte.

{
  "age" : 45,
  "hobbies" : null,
  "friends" : null,
  "salary" : null,
  "playerName" : "乔丹"
}

Se não quisermos que o valor nulo seja refletido no resultado da serialização JSON, podemos usar o método a seguir. Se você deseja ignorar a variável de membro nulo no escopo global de uma determinada serialização, você pode usar a seguinte API

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

Ou adicione o seguinte comentário acima do nome da classe. Esta anotação terá efeito para todas as variáveis ​​de membro na classe.Contanto que a variável de membro seja nula, ela não será incluída no resultado da serialização.

@JsonInclude(JsonInclude.Include.NON_NULL)
public class PlayerStar {
   ......
}

Se quisermos ignorar null separadamente para certas variáveis ​​de membro na classe PlayerStar, podemos adicionar anotações às variáveis ​​de membro.

@JsonInclude(JsonInclude.Include.NON_NULL)
private String[] hobbies;    //业余爱好,数组
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<String> friends;   //  朋友
@JsonInclude(JsonInclude.Include.NON_NULL)
private Map<String, BigDecimal> salary; //年收入 Map

Depois de ignorar as variáveis ​​de membro nulo, o resultado da serialização JSON é o seguinte

{
  "age" : 45,
  "playerName" : "乔丹"
}

Seis, ignore o campo especificado

Por padrão, Jackson não serializará e desserializará variáveis ​​de membro estáticas e temporárias. Nós também podemos passar

  • @JsonIgnoreAdicionada à variável de membro de classe, a variável de membro será excluída do processo de serialização e desserialização
  • @JsonIgnorePropertiesAdicione à declaração da classe para especificar quais campos da classe são excluídos do processo de serialização e desserialização

Você pode escolher uma das duas anotações acima. Usei as duas anotações no código abaixo e as funções são repetidas

@Data
@JsonIgnoreProperties({"hobbies", "friends","salary"})
public class PlayerStar {

  @JsonProperty("playerName")
  private String name;
  private Integer age;

  @JsonIgnore
  private String[] hobbies;    //业余爱好,数组
  @JsonIgnore
  private List<String> friends;   //  朋友
  @JsonIgnore
  private Map<String, BigDecimal> salary; //年收入 Map

......

Depois de adicionar anotações às variáveis ​​de classe ou membro, os resultados da serialização são os seguintes e os campos especificados são ignorados.

{
  "age" : 45,
  "playerName" : "乔丹"
}

Deve-se observar que essas duas anotações não afetam apenas o processo de serialização em strings JSON, mas também o processo de desserialização de strings JSON em objetos java. Exemplo: se a string JSON contiver o valor do atributo hobbies de JsonIgnore na classe, ela não será desserializada e atribuída à variável membro hobbies do objeto java.

Bem-vindo a seguir meu blog, existem muitas coleções boutique

  • Este artigo é reproduzido com a indicação da fonte (a conexão deve ser anexada, e o texto não pode ser reproduzido somente): Carta Blog da Brother .

Se você acha que é útil para você, por favor, curta e compartilhe para mim! Seu apoio é minha motivação criativa inesgotável! . Além disso, o autor produziu o seguinte conteúdo de alta qualidade recentemente e espero sua atenção.

Acho que você gosta

Origin blog.csdn.net/hanxiaotongtong/article/details/108634752
Recomendado
Clasificación