简体   繁体   English

当随机生成属性键时,如何使用 Jackson 从/向 POJO 序列化和反序列化 JSON

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

I'm receiving JSON from a service with randomly generated property key我从具有随机生成的属性密钥的服务中收到 JSON

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

I've created POJO class using jackson.annotations-2.13.4 and java 11我使用 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;
    }

}

But when I've tried to deserialize it i received error:但是当我试图反序列化它时,我收到了错误:

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)

So I'm looking for a way how to properly deserialize such a JSON and how to serialize it if i would use this POJO to create same JSON for another service Would Appreciate for your help!所以我正在寻找一种方法如何正确反序列化这样的 JSON 以及如何序列化它,如果我会使用这个 POJO 为另一个服务创建相同的 JSON 将感谢您的帮助!

I assume you tried to deserialize this JSON as a UserResponse .我假设您尝试将此 JSON 反序列化为UserResponse

In that case, the JSON would need to have a property users with the map of properties:在这种情况下,JSON 需要具有属性 map 的属性users

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

You could also read the original JSON with:您还可以通过以下方式阅读原始 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