小编umb*_*ile的帖子

使用Jackson从JSON数组中检索字符串

我找到了几个接近我正在尝试做的答案,但还不够,我已经能够让它发挥作用了.我有一堆JSON的,看起来像这样的例子(实际上只几个层次更深,并与数百个项目在我要访问的级别){"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}.我不能改变格式; 这是别人的API.我不需要相当多的东西; 事实上我只想要一些像["bobsyeruncle","easyaspie"]的数组.(或列表或其他.)

我尝试了一个没有数组的简单JSON版本,并且能够使用rootNode.get("query")轻松访问单个字符串.get("pages")...以https描述的方式://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608.但是我无法以这种方式进入阵列.我在这里找到的大多数答案都假设我想要创建一个像"链接"这样的POJO,其中包括"单词"和"代码",我不这样做.为了访问我想要的字符串,是否有必要创建类似"链接"列表的内容,包括"单词"和"代码",然后忽略"代码"?这似乎不对.

(另外,如果有人能指出JacksonInFiveMinutes教程和整个javadoc之间的文档/教程,我相信这也会有所帮助.)

我觉得ETA有用了!

            String theJsonString = "{\"query\":{\"pages\":{\"links\":"
                + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(theJsonString);
        JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links");
        for (int i = 0; i < interestingObjectNode.size(); i ++) {
            System.out.println(interestingObjectNode.get(i).path("word").asText());
        }
Run Code Online (Sandbox Code Playgroud)

java json jackson

11
推荐指数
1
解决办法
2万
查看次数

MongoDB:如果不存在则插入记录,如果存在则忽略

我有一系列MongoDB记录,如:

{"name":"Bob", "gpa":4} {"name":"Sarah", "gpa":3}

我会遇到可能会或可能不会属于同一个人的各种其他记录.如果他们是新人,我想接受他们,如果他们是我们以前见过的人,就不要更新他们.所以,如果我得到{"name":"Jim", "gpa":2},我想接受原样.如果我得到{"name":"Sarah", "gpa":4}(不同的GPA值),我想忽略它.这似乎不是将update"upsert"设置为yes 或者使用"upsert" 的逻辑findAndModify.

/sf/answers/228220331/建议一种方式(第一个字段上的唯一索引,插入记录,立即更新第二个字段)但它已经有几年了,我想知道是否有更好的方法现在只需一步即可完成此操作.

编辑:

接受的答案看起来很棒,但它对我不起作用!首先,我创建了索引(这是使用Java驱动程序):

nameIndex.put("name", 1);
nameIndex.put("unique", true);
queue.ensureIndex(nameIndex);
Run Code Online (Sandbox Code Playgroud)

我可以从命令行看到索引存在且是唯一的.然后,插入一个项目:

DBObject person = new BasicDBObject();
person.put("name", "Bob");
person.put("score", 200000);
queue.insert(person);
Run Code Online (Sandbox Code Playgroud)

之后,得分最高的项目的分数降至零:

BasicDBObject reset = new BasicDBObject();
reset.put("$set", new BasicDBObject("score", 0));
DBObject dbObj = queue.findAndModify(null, new BasicDBObject("score", -1), reset);
Run Code Online (Sandbox Code Playgroud)

所有这些都按预期工作!但是,稍后,可能会再次找到相同的名称,并带有新的分数.当最后一段代码运行时,会创建一个具有不同分数的新项目,这正是我不想要的:

BasicDBObject queueable = new BasicDBObject();
queueable.put("name", "Could be Bob again, could be someone new");
queueable.put("score", 1234);
queue.insert(queueable);
Run Code Online (Sandbox Code Playgroud)

如果我搜索Bob,我会发现:

{ "_id" : …
Run Code Online (Sandbox Code Playgroud)

java upsert mongodb

7
推荐指数
2
解决办法
1万
查看次数

正则表达式捕获未知数量的重复组

我正在尝试编写一个正则表达式,以便在Java程序中使用,该程序将识别可能在输入中出现未知次数的模式.我愚蠢的小例子是:

String patString = "(?:.*(h.t).*)*";

然后我尝试通过循环matcher.group(i)从"小屋很热"这样的行访问匹配.它只会记住最后一个匹配(在这种情况下,"热"),因为只有一个捕获组 - 我猜想matcher.group(1)的内容会被重写,因为捕获组会被重用.我想,虽然是某种含有阵列的两个 "小屋"和"热".

有一个更好的方法吗?FWIW,我真正想做的是在信号词之后拾取所有(可能是多字的)专有名词,其间可能有其他单词和标点符号.因此,如果"锯"是信号,我们"我看见鲍勃与约翰史密斯,他的妻子玛格丽特,"我想要{"鲍勃","约翰史密斯","玛格丽特"}.

java regex capture-group

3
推荐指数
1
解决办法
3997
查看次数

标签 统计

java ×3

capture-group ×1

jackson ×1

json ×1

mongodb ×1

regex ×1

upsert ×1