Как добавить новый узел json, используя библиотеку java, такую ​​как Jayway JsonPath - PullRequest
0 голосов
/ 25 августа 2018

у меня есть строка 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 голосов
/ 25 августа 2018

Вы можете достичь того, чего хотите, используя библиотеку Джексона.Сначала получите rootNode, а затем дочерние узлы и получите элемент по указанному индексу.А затем создайте новый объект Book и добавьте его в массив book, используя метод addPojo.

Вот код:

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"
      }
    ]
  }
}

Джексон maven:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
    </dependency>
...