Джексон десериализации 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)
помогите мне решить эту проблему,
Ответы
Ответ 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
.