JSON到具有随机密钥的Java对象

时间:2019-12-24 06:39:23

标签: java json jackson

我正在尝试将以下JSON转换为Java对象,并最终导致UnrecognizedPropertyException。

    {
    "5214": [{
        "name": "sdsds",
        "age": "25",
        "address": null
    },
    {
        "name": "sdfds",
        "age": "26",
        "address": null
    }]
   }

"5214"是我得到的随机密钥。我可以通过稍微修改JSON来隐蔽它。但是我想知道是否有任何可能的方法来转换提到的JSON。我什至尝试了以下片段作为参考。

    public class SampleTest {

       private Map<String, List<EmployeeDetails>> employeeDetails = new HashMap<String, List<EmployeeDetails>>();

       public Map<String, List<EmployeeDetails>> getEmployeeDetails() {
              return employeeDetails;
       }

       public void setEmployeeDetails(Map<String, List<EmployeeDetails>> employeeDetails) {
              this.employeeDetails = employeeDetails;
       }

   }


   public class EmployeeDetails {

       private String name;
       private String age;
       private String address;

       //Getters and Setters
   }

有人可以指导我吗?

4 个答案:

答案 0 :(得分:1)

使用类型参考(导入Java的Jackson软件包

TypeReference<Map<String, List<EmployeeDetails>>> typeReference = new TypeReference<Map<String, List<EmployeeDetails>>>()
{
};                                                    
Map<String, List<EmployeeDetails>> employeeDetails = new ObjectMapper().readValue(jsonString, typeReference);

答案 1 :(得分:0)

检查that中的内容

也许:

public class Data {

    // String contain the Key, for example: 5214
    Map<String, List<EmployeeDetails>> employeeDetails = 
        new HashMap<String,List<EmployeeDetails>>();

    public Data() {

    }

    @JsonAnyGetter
    public Map<String, List<EmployeeDetails>> getEmployeeDetails() {
        return employeeDetails;
    }
}

答案 2 :(得分:0)

我将使用少量帮助程序类的自定义反序列化器。为了使代码(我想是很明确)更清晰,请创建列表对象:

@SuppressWarnings("serial")
@Getter @Setter
public class EmployeeDetailsList extends ArrayList<EmployeeDetails> {
    // this will hold the arbitrary name of list. like 5214
    private String name;
}

然后此列表似乎在一个对象内部,例如Wrapper

@Getter
@RequiredArgsConstructor
@JsonDeserialize(using = WrapperDeserializer.class)
public class Wrapper {
    private final EmployeeDetailsList employeeDetailsList;
}

因此,有注释@JsonDeserializer处理反序列化Wrapper。无法将未知字段名称直接反序列化为某些定义的类型,因此我们需要使用这种自定义反序列化器之类的机制,该机制检查Wrapper中的内容并确定要反序列化的内容以及如何进行反序列化。

以下是解串器的工作原理:

public class WrapperDeserializer extends JsonDeserializer<Wrapper> {

    private final ObjectMapper om = new ObjectMapper();
    @Override
    public Wrapper deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        TreeNode node = p.readValueAsTree();
        // This is the place for caution. You should somehow know what is the correct node
        // Here I happily assume there is just the one and first
        String fName = node.fieldNames().next();

        EmployeeDetailsList edl = om.readValue(node.get(fName).toString(),
               EmployeeDetailsList.class); 
        edl.setName(fName);
        return new Wrapper(edl);
    }

}

请仔细检查它,从某种意义上来说,找到正确的节点并不完美,并且可以用其他方法更好地实例化。但是它应该让您有预感该怎么做。

答案 3 :(得分:-3)

您正在映射到不正确的POJO。应该是这样。

true