如何将json转换为没有给出参数名称的pojo

时间:2019-06-17 13:25:19

标签: java json jackson jackson-databind

我正在尝试使用Jackson将JSON转换为Java。但是没有得到适当的解决方案。我有没有参数名称的JSON。我想使用PropertyOrder将json字段映射到POJO。

我尝试了所有可能的类型引用,但没有得到想要的结果。

我的JSON类似于: {“ 1222”:[“ Joe”,26,158],“ 1232”:[“ root”,29,168]}

下面是pojo:

public class Employee{
    int empId;
    EmployeeAtttribute employeeAttribute;
}

@JsonProertyOrder({"name", "seq", "height"})  
public class EmployeeAttribute{     
    String name;  
    int seq;  
    int height;  
}  

我正在寻找使用JSON创建的Employee类的列表。

谢谢。

2 个答案:

答案 0 :(得分:2)

将EmployeeAttribute类注释为:

@JsonFormat(shape = JsonFormat.Shape.ARRAY)
@JsonPropertyOrder({"name", "seq", "height"})
public class EmployeeAttribute
{

    public String name;

    public int seq;

    public int height;

    @Override
    public String toString()
    {
        return "EmployeeAttribute [name=" + name + ", seq=" + seq + ", height=" + height + "]";
    }
}

您可以使用以下代码将JSON转换为对象(地图):

ObjectMapper mapper = new ObjectMapper();
String jsonInput = "{\"1222\": [\"Joe\", 26, 158],\"1232\": [\"root\", 29, 168] }";
TypeReference<Map<String, EmployeeAttribute>> typeRef =
    new TypeReference<Map<String, EmployeeAttribute>>()
    {
    };

Map<String, EmployeeAttribute> map = mapper.readValue(jsonInput, typeRef);
map.values().iterator().forEachRemaining(System.out::println);

进一步将其转换为员工列表:

 List<Employee> employee = new ArrayList<>();
 for (Map.Entry<String, EmployeeAttribute> entry : map.entrySet()) {
       employee.add(new Employee(Integer.valueOf(entry.getKey()), 
  entry.getValue()));
 }

对于扩展的要求,其中输入的JSON字符串包含'emp_count'键,由于输入实际上无法解析为Java Object模型,因此可以使用这种方法读取并删除该元素,以便按照原始逻辑将像以前一样工作,并且仍然读取/提取“ emp_count”。根据需要进行优化:

String jsonInput = "{\"1222\": [\"Joe\", 26, 158],\"1232\": [\"root\", 29, 168], \"emp_count\" : \"2\"}";
JsonNode node = mapper.readTree(jsonInput);
if (node.has("emp_count")) {
   int employeesInArray = ((ObjectNode) node).remove("emp_count").asInt();
   System.out.println("Num of employees in array: " + employeesInArray);
} else {
   System.out.println("Num of employees was not provided, missing emp_count element");
}

//updated JSON input String, that works as before
jsonInput = node.toString();

答案 1 :(得分:0)

您的json将被解析为Map<String, List<Object>>。 之后,您可以将Map<String, List<Object>>转换为Employee或更改json格式。 {"id":1222, "attribute":{"name":"Joe", "seq":26, "height": 158}}