как конвертировать JSON в Pojo, где не указано имя параметра - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь конвертировать 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;  
}  

Я хочу получить список List Employee, созданный с использованием JSON.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

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();
0 голосов
/ 17 июня 2019

Ваш JSON будет проанализирован как Map<String, List<Object>>. После этого вы можете конвертировать Map<String, List<Object>> в вашего сотрудника или изменить формат json. {"id":1222, "attribute":{"name":"Joe", "seq":26, "height": 158}}

...