簡體   English   中英

當隨機生成屬性鍵時,如何使用 Jackson 從/向 POJO 序列化和反序列化 JSON

[英]How to serialize & deserialize JSON from/to POJO using Jackson, when property key randomly generated

我從具有隨機生成的屬性密鑰的服務中收到 JSON

{
    "random1" : {
        "name" : "john",
        "lastName" : "johnson"
    },
    "nextRandom500" : {
        "name" : "jack",
        "lastName" : "jackson"
    },
    "random100500" : {
        "name" : "jack",
        "lastName" : "johnson"
    }   
}

我使用 jackson.annotations-2.13.4 和 java 11 創建了 POJO class

import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.Map;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

@Data
@SuperBuilder(toBuilder=true)
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserResponse {
private Map<String,User> users;

    @Data
    @SuperBuilder(toBuilder=true)
    @NoArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class User {
        private String name;
        private String lastName;
    }

}

但是當我試圖反序列化它時,我收到了錯誤:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "random1" (class com.pingidentity.UserResponse), not marked as ignorable (one known property: "variables"\])
at \[Source: (String)"{
"random1":
{
"name": "john",
"lastName": "johnson"
},
"nextRandom500":
{
"name": "jack",
"lastName": "jackson"
},
"random100500":
{
"name": "john",
"lastName": "jackson"
}
}"; line: 3, column: 6\] (through reference chain: com.pingidentity.UserResponse\["random1"\])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1127)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2023)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1700)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1678)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper.\_readMapAndClose(ObjectMapper.java:4674)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3629)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3597)
at com.pingidentity.Test.main(Test.java:507)

所以我正在尋找一種方法如何正確反序列化這樣的 JSON 以及如何序列化它,如果我會使用這個 POJO 為另一個服務創建相同的 JSON 將感謝您的幫助!

我假設您嘗試將此 JSON 反序列化為UserResponse

在這種情況下,JSON 需要具有屬性 map 的屬性users

{
  "users": {
    "random1" : {
      "name" : "john",
      "lastName" : "johnson"
    },
    "nextRandom500" : {
      "name" : "jack",
      "lastName" : "jackson"
    },
    "random100500" : {
      "name" : "jack",
      "lastName" : "johnson"
    }
  }
}

您還可以通過以下方式閱讀原始 JSON:

Map<String,User> users = objectMapper.readValue(json, 
    new TypeReference<Map<String,User>>(){});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM