【问题标题】:How to add new json node using a java library like Jayway JsonPath如何使用像 Jayway JsonPath 这样的 java 库添加新的 json 节点
【发布时间】:2018-08-25 07:18:02
【问题描述】:

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

有没有人使用过任何可以满足这个用例的库?

【问题讨论】:

    标签: java jsonpath json-path-expression jayway


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多