我有一个json字符串说:
{"store" : {
"book" : [
{
"category" : "reference",
"author" : "Nigel Rees",
"title" : "Sayings of the Century",
"display-price" : 8.95
},
{
"category" : "fiction",
"author" : "Evelyn Waugh",
"title" : "Sword of Honour",
"display-price" : 12.99
},
{
"category" : "fiction",
"author" : "Herman Melville",
"title" : "Moby Dick",
"isbn" : "0-553-21311-3",
"display-price" : 8.99
},
{
"category" : "fiction",
"author" : "J. R. R. Tolkien",
"title" : "The Lord of the Rings",
"isbn" : "0-395-19395-8",
"display-price" : 22.99
}
]
}
并且我想根据某些条件在此字符串中添加一个新的json节点
example: add $.book[0].origin = 'burma' if not present
我正在搜索可以执行此操作但找不到任何内容的库。我尝试过JsonPath。
有人使用过任何可以满足此用例的库吗?
答案 0 :(得分:1)
您可以使用Jackson库实现所需的功能。首先获取rootNode,然后获取子节点,并获取给定索引的元素。然后创建一个新的Book对象,并使用addPojo方法将其附加到book数组中。
这是代码:
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("test.json");
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(file);
JsonNode store = rootNode.get("store");
JsonNode books = store.get("book");
// get an element in that node
JsonNode bookElement = books.get(0);
Book book = new Book();
book.setAuthor("test");
book.setCategory("test");
book.setDisplayPrice("test");
book.setTitle("test");
// you can change the logic with editing following lines
// if has the desired field
if (bookElement.hasNonNull("origin")) {
// if field value is not equal to given text
if (!bookElement.get("origin").textValue().equalsIgnoreCase("burma")) {
((ArrayNode)books).addPOJO(book);
}
}
// write to file
mapper.writeValue(file, rootNode);
}
}
图书班:
@Data // comes from lombok for getter-setter
class Book {
private String category;
private String author;
private String title;
@JsonProperty("display-price")
private String displayPrice;
@JsonInclude(JsonInclude.Include.NON_NULL)
private String isbn;
}
如果您具有字段原点且不等于“缅甸”,则该文件将在附加对象后变为:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"display-price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"display-price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"display-price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"display-price": 22.99
},
{
"category": "test",
"author": "test",
"title": "test",
"display-price": "test"
}
]
}
}
杰克逊专家:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>