Подтвердить что ты не робот

Джексон десериализации json для java-объектов

Вот мой код Java, который используется для де-сериализации, Я пытаюсь преобразовать строку json в объект java. При этом я использовал следующий код:

package ex1jackson;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Ex1jackson {
public static void main(String[] args) {
   ObjectMapper mapper = new ObjectMapper();
try {
        String userDataJSON = "[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"
                              + "{\"id\": \"value21\",\"name\":\"value22\",\"qty\": \"value23\"}]";
        product userFromJSON = mapper.readValue(userDataJSON, product.class);
        System.out.println(userFromJSON);
    } catch (JsonGenerationException e) {
        System.out.println(e);
        } catch (JsonMappingException e) {
       System.out.println(e);
    } catch (IOException e) {
    System.out.println(e);
    } 
}
}

и мой класс product.java

package ex1jackson;
public class product 
{
private String id;
private String name; 
private String qty; 

@Override
public String toString() {
    return "Product [id=" + id+ ", name= " + name+",qty="+qty+"]";
}
}

Я получаю следующую ошибку.

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "id" (class ex1jackson.product), not marked as ignorable (0 known properties: ]) at 
[Source: [email protected]; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) 
BUILD SUCCESSFUL (total time: 0 seconds)

помогите мне решить эту проблему,

4b9b3361

Ответ 1

Похоже, вы пытаетесь прочитать объект из JSON, который фактически описывает массив. Объекты Java сопоставляются с объектами JSON с фигурными скобками {}, но ваш JSON фактически начинается с квадратных скобок [], обозначающих массив.

У вас есть List<product>. Чтобы описать родовые типы, из-за стирания типа Java, вы должны использовать TypeReference. Ваша десериализация может читать: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

Несколько других заметок: ваши классы всегда должны быть CamelCased. Ваш основной метод может быть только public static void main(String[] args) throws Exception, который избавит вас от всех бесполезных блоков catch.

Ответ 2

Вы должны изменить строку

product userFromJSON = mapper.readValue(userDataJSON, product.class);

к

product[] userFromJSON = mapper.readValue(userDataJSON, product[].class);

так как вы десериализируете массив (кстати, вы должны начинать имена классов с заглавными буквами, как упоминалось ранее). Кроме того, вам необходимо создать методы настройки для ваших полей или пометить их как общедоступные, чтобы сделать эту работу.

Изменить: вы также можете пойти с предложением Стивена Шланкса и использовать

List<product> userFromJSON =
        mapper.readValue(userDataJSON, new TypeReference<List<product>>() {});

вместо этого, если вы хотите избежать массивов.

Ответ 3

 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

 System.out.println("id : "+node.findValues("id").get(0).asText());

Это также сделало трюк.

Ответ 4

Вашему классу product нужен конструктор без параметров. Вы можете сделать это частным, но Джексону нужен конструктор.

В качестве примечания: вы должны использовать корпус Pascal для имен вашего класса. Это product, а не product.