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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2023-05-12 16:07:06
nach vorne
938 Leute haben es durchsucht

JSON-Serialisierung/Deserialisierung steuern

1. Die Verwendung von @JsonIgnoreProperties

@JsonIgnoreProperties(value = { "prop1","prop2" })
Nach dem Login kopieren

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

@JsonIgnoreProperties(ignoreUnknown = true)
Nach dem Login kopieren

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);
        }
    }
    Nach dem Login kopieren
  • 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"
}
Nach dem Login kopieren
Nach dem Login kopieren
    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;
        }
    }
    Nach dem Login kopieren

    3. Passen Sie eine Serialisierungstoolklasse an, die StdSerializer implementieren muss ;
  • {
    "brand":"Benz",
    "attr2":"val2",
    "attr1":"val1"
    }
    Nach dem Login kopieren
    Nach dem Login kopieren
(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;
}
Nach dem Login kopieren

(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;
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

(2)

Serializer-Modifikator

@JsonInclude(Include.NON_NULL)
Nach dem Login kopieren

(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();
 }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
Holen: JSON-Daten übertragen
Aus 1970-01-01 08:00:00
0
0
0
MySQL-Speicher-JSON-Fehler
Aus 1970-01-01 08:00:00
0
0
0
Finden Sie passende Ganzzahlen in JSON.
Aus 1970-01-01 08:00:00
0
0
0
PHP-JSON-Konvertierung
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage