Annotate EmployeeAttribute class as:
@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 в Object (map):
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);
Далее преобразовать это в список Employee:
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, можно использовать этот подход, который читает этот элемент и удаляет его, так что синтаксический анализ в соответствии с исходной логикой будет работать, как и раньше, и 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();