如何使用 Jackson Java 从 JSON 读取值
How to read value from JSON with Jackson Java
我有一个 JSON 文件:
{
"param": {
"rows": 1,
"columns": "4"
},
"items": [{
"name": "A",
"amount": 33,
"price": "43"
}, {
"name": "B",
"amount": 43,
"price": "2"
}, {
"name": "C",
"amount": 45,
"price": "1"
}, {
"name": "D",
"amount": 543,
"price": "55"
}]
}
我想单独取货。我尝试去做,结果做了 null
:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Items item; // only items
item = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
System.out.println(item.getAmount());
这是 class 项:
public class Items {
private String name;
private String amount;
private double price;
public Items() {
super();
}
//constructor
//getters and setters
}
我做错了什么?如何正确读取物品的价值?
您应该将其读作 Map ,然后使用您的地图作为来源来填充您的项目。此外,有一个开源库具有基于 Jackson 库的功能,真正简化了 reading/writing 对象 from/to Json。如果你有一个 json 字符串,你所要做的就是:
Map<String, Object> map = JsonUtils.readObjectFromJsonString(jsonString, Map.class);
尽管它会抛出 IOException,因此您需要处理它。这是Javadoc. The library is called MgntUtils and could be found as Maven artifact and on the Github(包括javadoc和源代码)
你没有正确处理 JSON 数组 - items - 正如我在 OP 下评论的那样,你需要做的就是重命名原始 class Items
到 Item
并创建另一个 class Items
如下,Jackson
库将为您完成剩下的工作:
public class Item {
private String name;
private String amount;
private double price;
// general getters/setters
}
public class Items {
private List<Item> items;
// general getter/setter
}
然后您可以使用您的代码片段反序列化 JSON 字符串:
Items items = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
System.out.println(items.get(0).getAmount());
首先,你需要有一个包含List item的对象,因为JSON文件有多个item,不是只有一个,你可以参考我的代码
public class ItemsList {
private List<Items> items;
public ItemsList () {
}
}
我们将修改映射器
item= objectMapper.readValue(new File("D:/example/file.json"), ItemsList.class);
但我认为您应该将 class 从 Items => Item
希望能帮到您解决问题
我建议你轻松拥有以下类、Example.java、Param.java、Item.java:
Example.java:
public class Example {
private Param param;
private List<Item> items;
//constructor
//getters and setters
}
Param.java:
public class Param {
private int rows;
private int columns;
//constructor
//getters and setters
}
Item.java
public class Item {
private String name;
private String amount;
private double price;
}
那你可以这样写:
Example example= objectMapper.readValue(new File("D:/example/file.json"),
Example.class);
for(Item item: example.getItems())
System.out.println(item.getAmount());
这里的问题是因为您的 JSON 文件的结构与您在 ObjectMapper.readValue
方法中作为第二个参数传递的 class 的结构不对应(Items.class 在你的例子中)。您需要对齐两个结构。
根据文件结构,您的 Items
文件应该是下一个
public class Items {
private Param param;
private List<Item> items;
// Getters & Setters
}
另外你需要创建 class Param
:
public class Param {
private Integer rows;
private Integer columns;
// Getters & Setters
}
和class Item
:
public class Item {
private String name;
private String amount;
private double price;
// Getters & Setters
}
之后您将能够通过下一个片段读取您的文件:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Items items = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
items.getItems().stream().map(Item::getAmount).forEach(System.out::println);
我有一个 JSON 文件:
{
"param": {
"rows": 1,
"columns": "4"
},
"items": [{
"name": "A",
"amount": 33,
"price": "43"
}, {
"name": "B",
"amount": 43,
"price": "2"
}, {
"name": "C",
"amount": 45,
"price": "1"
}, {
"name": "D",
"amount": 543,
"price": "55"
}]
}
我想单独取货。我尝试去做,结果做了 null
:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Items item; // only items
item = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
System.out.println(item.getAmount());
这是 class 项:
public class Items {
private String name;
private String amount;
private double price;
public Items() {
super();
}
//constructor
//getters and setters
}
我做错了什么?如何正确读取物品的价值?
您应该将其读作 Map
Map<String, Object> map = JsonUtils.readObjectFromJsonString(jsonString, Map.class);
尽管它会抛出 IOException,因此您需要处理它。这是Javadoc. The library is called MgntUtils and could be found as Maven artifact and on the Github(包括javadoc和源代码)
你没有正确处理 JSON 数组 - items - 正如我在 OP 下评论的那样,你需要做的就是重命名原始 class Items
到 Item
并创建另一个 class Items
如下,Jackson
库将为您完成剩下的工作:
public class Item {
private String name;
private String amount;
private double price;
// general getters/setters
}
public class Items {
private List<Item> items;
// general getter/setter
}
然后您可以使用您的代码片段反序列化 JSON 字符串:
Items items = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
System.out.println(items.get(0).getAmount());
首先,你需要有一个包含List item的对象,因为JSON文件有多个item,不是只有一个,你可以参考我的代码
public class ItemsList {
private List<Items> items;
public ItemsList () {
}
}
我们将修改映射器
item= objectMapper.readValue(new File("D:/example/file.json"), ItemsList.class);
但我认为您应该将 class 从 Items => Item
希望能帮到您解决问题
我建议你轻松拥有以下类、Example.java、Param.java、Item.java:
Example.java:
public class Example {
private Param param;
private List<Item> items;
//constructor
//getters and setters
}
Param.java:
public class Param {
private int rows;
private int columns;
//constructor
//getters and setters
}
Item.java
public class Item {
private String name;
private String amount;
private double price;
}
那你可以这样写:
Example example= objectMapper.readValue(new File("D:/example/file.json"),
Example.class);
for(Item item: example.getItems())
System.out.println(item.getAmount());
这里的问题是因为您的 JSON 文件的结构与您在 ObjectMapper.readValue
方法中作为第二个参数传递的 class 的结构不对应(Items.class 在你的例子中)。您需要对齐两个结构。
根据文件结构,您的 Items
文件应该是下一个
public class Items {
private Param param;
private List<Item> items;
// Getters & Setters
}
另外你需要创建 class Param
:
public class Param {
private Integer rows;
private Integer columns;
// Getters & Setters
}
和class Item
:
public class Item {
private String name;
private String amount;
private double price;
// Getters & Setters
}
之后您将能够通过下一个片段读取您的文件:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Items items = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
items.getItems().stream().map(Item::getAmount).forEach(System.out::println);