如何使用Jayway JsonPath之类的Java库添加新的json节点

时间:2018-08-25 07:18:03

标签: java jsonpath json-path-expression jayway

我有一个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

有人使用过任何可以满足此用例的库吗?

1 个答案:

答案 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>