Heim  >  Artikel  >  Java  >  So lösen Sie die Serialisierungs- und Deserialisierungsprobleme von Json in SpringBoot

So lösen Sie die Serialisierungs- und Deserialisierungsprobleme von Json in SpringBoot

WBOY
WBOYnach vorne
2023-05-12 16:07:06721Durchsuche

JSON-Serialisierung/Deserialisierung steuern

1. Die Verwendung von @JsonIgnoreProperties

@JsonIgnoreProperties(value = { "prop1","prop2" })

wird verwendet, um die Pojo-Klasse zu ändern und die angegebenen Attribute während der Serialisierung und Deserialisierung zu ignorieren.

@JsonIgnoreProperties(ignoreUnknown = true)

Wird zum Ändern des Pojo verwendet Klasse, ignoriert Eigenschaften, die während der Deserialisierung nicht festgelegt werden können, einschließlich Eigenschaften, die nicht im Konstruktor festgelegt werden können und über keine entsprechenden Setter-Methoden verfügen Die Eigenschaftsnamen sind inkonsistent. Sie können @JsonProperty verwenden, um die Methode getter () oder setter () zu kommentieren. Diese Annotation legt den Eigenschaftsnamen fest, der json entspricht. Darüber hinaus wird @JsonProperty häufig zum Kommentieren der formalen Parameter des Konstruktors verwendet. In diesem Fall sollte die Annotation „@JsonCreator“ hinzugefügt werden zwei Methoden:

Methode 1: Einen Parameterlosen Konstruktor hinzufügen

Methode 2: Fügen Sie die Annotation @JsonCreator zu diesem parametrisierten Konstruktor hinzu, und die Parameter müssen mit @JsonProperty annotiert werden.

  • 4 Anmerkungen mit @JsonGetter

  • Wenn der Name des JSON-Felds nicht mit dem Eigenschaftsnamen des Pojo übereinstimmt, können Sie @JsonGetter verwenden, um die getter()-Methode zu kommentieren, und @JsonSetter, um die setter()-Methode zu kommentieren Geben Sie einen Eigenschaftsnamen an.
  • 5. Es werden allgemeine Objekteigenschaftennamen festgelegt, z. B. das Car-Objekt, das benannte Attribute wie Marke/Preis hat Manchmal müssen wir auch einige erweiterte Attribute festlegen. Die Namen dieser erweiterten Attribute werden normalerweise zum Speichern der K/V dieser erweiterten Attribute verwendet muss in die Klasse deserialisiert werden. In Map muss der Klasse eine K/V-Setter-Methode hinzugefügt werden, und diese Setter-Methode muss mit @JsonAnySetter annotiert werden Daten können in die Map deserialisiert werden:

    public class Car {
        public String brand;
        private Map<String, String> properties;
     
        @JsonAnySetter
        public void add(String key, String value) {
            properties.put(key, value);
        }
    }
  • 6 Die @JsonAnyGetter-Annotation

entspricht der @JsonAnySetter-Annotation. Wenn Sie die Map-K/V-Attribute in JSON serialisieren möchten, müssen Sie einen @JsonAnyGetter hinzufügen Methode zur Klasse, die KV direkt zurückgibt. @JsonSerialize- und @JsonDeserialize-Annotationen

@ Die JsonSerialize-Annotation kann eine spezielle Serialisierungsfunktion für Klassenattribute festlegen, und die @JsonDeserialize-Annotation wird verwendet, um die Deserialisierungsfunktion für JSON-Attribute anzupassen

SpringBoot-Serialisierungsregeln

Include .Include.ALWAYS Das Standardattribut

Include.NON_DEFAULT ist der Standardwert und wird nicht serialisiert.

Include.NON_EMPTY Das Attribut ist leer ("") oder NULL und ist nicht serialisiert

Include.NON_NULL Das Attribut ist NULL und ist nicht serialisiert

1 Globale Einstellungen

{
"brand":"Benz",
"attr2":"val2",
"attr1":"val1"
}
    2 . Lokale Einstellungen
  • für die Entitätsklasse oder das Feld, das festgelegt werden muss. Fügen Sie Anmerkungen hinzuInclude.Include.ALWAYS 默认

  • Include.NON_DEFAULT 属性为默认值不序列化

  • Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化

  • Include.NON_NULL

    public class Car {
        public String brand;
        private Map<String, String> properties;
     
        @JsonAnyGetter
        public Map<String, String> getProperties() {
            return properties;
        }
    }

    3. Passen Sie eine Serialisierungstoolklasse an, die StdSerializer8742468051c85b06f0a0af9e3e506b5c implementieren muss ;
  • {
    "brand":"Benz",
    "attr2":"val2",
    "attr1":"val1"
    }
(2) Verwenden Sie Annotationen, um auf Entitätsklassen zu reagieren. Das obige

public class Event {
    public String name;
 
    @JsonFormat(
      shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    public Date eventDate;
}

(3) kann für Entitätsobjektfelder verwendet werden, um NULL-Werte zu verarbeiten oder

/**
 * 〈返回json空值去掉null和""〉 〈功能详细描述〉
 * 
 * @author gogym
 * @version 2017年10月13日
 * @see JacksonConfig
 * @since
 */
@Configuration
public class JacksonConfig
{
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
    {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
        // Include.Include.ALWAYS 默认
        // Include.NON_DEFAULT 属性为默认值不序列化
        // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
        // Include.NON_NULL 属性为NULL 不序列化,就是为null的字段不参加序列化
        //objectMapper.setSerializationInclusion(Include.NON_EMPTY);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
        return objectMapper;
    }
}

4 zu konvertieren Nullwertverarbeitung in JSON-Daten und Konvertierung des String-Typs. Der Nullwert wird in „“ konvertiert, der Nullwert des Sammlungsarraytyps wird in [] konvertiert, der Nullwert des primitiven Datentyps wird in 0 konvertiert, der Nullwert des booleschen Typs wird konvertiert auf „false“ und der Nullwert des Entitätsobjekts wird in „{}“ konvertiert.

(1)

Benutzerdefinierter Nullwert-Serializer

spring.jackson.default-property-inclusion=non_null
spring:
  jackson:
    default-property-inclusion: non_null

(2)

Serializer-Modifikator

@JsonInclude(Include.NON_NULL)

(3)

Jackson-Entität konfigurieren

public class ClientObjectSerialize extends JsonSerializer<CreditBorrowerRepaymentRequestDto>{
 @Override
 public void serialize(CreditBorrowerRepaymentRequestDto dto, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
 
  jsonGenerator.writeStartObject();
  try {
   Field[] fields = dto.getClass().getDeclaredFields();
   for (Field field : fields) {
    field.setAccessible(true);
    if(null == field.get(dto)){
     continue; 
    }
    jsonGenerator.writeFieldName(field.getName());
    jsonGenerator.writeObject(field.get(dto));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  jsonGenerator.writeEndObject();
 }
}

Das obige ist der detaillierte Inhalt vonSo lösen Sie die Serialisierungs- und Deserialisierungsprobleme von Json in SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen