使用jackson将json解析为pojo的变量,该变量是一个对象或两个对象

问题描述

java中动态属性变量如何解析json到pojo。

Rest api 返回数据:

   "db": {
      "queryA": {

           "name": "A","age": "12","startDT": "202102030800"

            }
         } 

或有时

 "db":{
    "queryA": 
            {

            "name": "A","startDT": "202102030800"
            },"queryB":
            {
            "name": "B","age": "20","startDT": "202102030800"
            }
     }

有时查询一个对象,有时是两个对象。

如何将这个动态查询映射到 java Pojo 类中。

       class Student{

           private Query query;
        }

解决方法

您需要将 'db' 属性视为 Map。查询,例如'queryA','queryB',... 等将是键,它们对应的对象是它们的值。请参考以下示例:

fileA JSON(提供的第一个示例 JSON):

{

      "db": {
      "queryA": {

           "name": "A","age": "12","startDT": "202102030800"

            }
         } 

}

fileB JSON(提供的第二个示例 JSON)

{

 "db":{
 
    "queryA": 
            {

            "name": "A","startDT": "202102030800"
            },"queryB":
            {
            "name": "B","age": "20","startDT": "202102030800"
            }
     }

}

数据(反序列化)类”

package org.test.json;

import java.util.HashMap;

public class DataClass {
    
    protected HashMap<String,Object> db;

    public HashMap<String,Object> getDb() {return db;}

    public void setDb(HashMap<String,Object> db) {this.db = db;}

}//calss closing

Jackson 反序列化代码:

package org.test.json;

import java.io.FileInputStream;

import com.fasterxml.jackson.databind.ObjectMapper;

public class VariableLengthAttrToMap {

    public static void main(String[] args) throws Exception{
        
        String jsonFilePath="D:\\workspaces\\mtplatform\\TechTest\\testfiles\\fileB.json";
        
        FileInputStream fis=new FileInputStream(jsonFilePath);
        
        ObjectMapper mapper=new ObjectMapper();
        System.out.println(mapper.readValue(fis,DataClass.class).getDb());
        
        fis.close();


    }//main closing

}//class closing

fileA 作为输入的结果是

{queryA={name=A,age=12,startDT=202102030800}}

fileB 作为输入的结果是

{queryA={name=A,startDT=202102030800},queryB={name=B,age=20,startDT=202102030800}}