1

我正在尝试通过 Jayway JsonPath 从 json 获取用户对象。我的课是:

 public class User{
    private String id;
    private String name;
    private String password;
    private String email;
    /*getters setters constructor*/
  }

和 json 示例:

{
  "user": [
    {
      "id": "1",
      "login": "client1",
      "password": "qwerty",
      "email": "client@gmail.com"
    }
  ]
}

我想得到这样的东西:

public Optional<User> find(String id) throws NoSuchEntityException {
    Optional<User> user = Optional.empty();
    try{
        Path path = Path.of(fileDestination+fileName);
        ReadContext ctx = JsonPath.parse(Files.readString(path));
        User readUser = ctx.read("$..user[*]",User.class,Filter.filter(where("id").is(id)));
        user = Optional.ofNullable(readUser);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return user;
}

或者获得如何编码的好建议:D

4

1 回答 1

1

这里有两件事

  1. 过滤时必须使用占位符?*否则过滤器将被忽略。
  2. read()将返回一个列表,而不是单个对象。

所以,我想,你需要这样的东西

String json = "{\r\n"
        + "  \"user\": [\r\n"
        + "    {\r\n"
        + "      \"id\": \"1\",\r\n"
        + "      \"login\": \"client1\",\r\n"
        + "      \"password\": \"qwerty\",\r\n"
        + "      \"email\": \"client@gmail.com\"\r\n"
        + "    }\r\n"
        + "  ]\r\n"
        + "}";

Predicate filterById = filter(where("id").is("1"));
List<User> users = JsonPath.parse(json).read("$.user[?]",filterById );

System.out.println(users);

参考:过滤谓词

where("category").is("fiction").and("price").lte(10D) );

List<Map<String, Object>> books =     
parse(json).read("$.store.book[?]", cheapFictionFilter); 

?注意路径中过滤器的占位符。当提供多个过滤器时,它们的应用顺序是占位符的数量必须与提供的过滤器的数量相匹配。您可以在一个过滤操作中指定多个谓词占位符[?, ?],两个谓词必须匹配。

于 2021-06-26T19:51:16.960 回答