【问题标题】:Mongo Java Driver 3.6.1 - How to parse a json array structured String to BasicDBListMongo Java Driver 3.6.1 - 如何将 json 数组结构化字符串解析为 BasicDBList
【发布时间】:2018-04-13 09:00:51
【问题描述】:

当我使用 MongoDB 2.x.x 时,我使用 (BasicDBList) JSON.parse("[]") 将字符串数据解析为 Document 数组。但最新的 MongoDB 驱动程序表示已弃用,BasicDbObject.parse("") 仅转换为 BasicDBObject

这是我之前在 2.x.x Java 驱动程序中使用的一些代码示例

BasicDbList skuList = (BasicDBList) JSON.parse(skus);

所以当我升级到 3.6.1 时,编译器说这已被弃用。并建议使用BasicDbObject.parse()

但这仅接受 JSON 对象结构化字符串 ...

{ "fruit": "apple"}

...不是 JSON 数组格式的字符串。

所以,如果我有一个像这样的字符串 "[\"SKU000001\", \"SKU0000002\", \"SKU0000003\"]" 如何转换为BasicDBList

【问题讨论】:

  • ["SKU000001", "SKU0000002", "SKU0000003"] -> 这是一个 JSON 数组,必须转换为 ArrayList/DBList。每个元素如何被视为文档?
  • @RahulRaj 抱歉,那是我的英语问题。我纠正了他们。我的问题实际上是如何在 mongo java driver 3.6.1 中将字符串转换为 BasicDbList。

标签: java mongodb deprecated mongo-java-driver jsonparser


【解决方案1】:

JSON.parse() 能够处理 JSON 数组,它读取第一个字符,如果它认为 JSON 是一个数组,它会相应地处理它:

case '[':
    value = parseArray(name);
    break;

BasicDBObject.parse() 需要一个有效的 JSON 文档,因此当给定一个孤立的 JSON 数组(即 JSON 文档中不包含的 JSON 数组)时,它将引发异常。

BasicDBObject.parse() 可以处理这个...

{"a": ["SKU000001", "SKU0000002", "SKU0000003"]}

...但它无法处理:

["SKU000001", "SKU0000002", "SKU0000003"]

因此,MongoDB v3.x 驱动程序中没有直接替代使用 JSON.parse() 解析 JSON 数组的方法。相反,您的选择是:

  1. 通过在有效的 JSON 文档中显示 JSON 数组来欺骗 BasicDBObject.parse(),例如:

    BasicDBObject basicDBObject = BasicDBObject.parse(String.format("{\"a\": %s}",
            "[\"SKU000001\", \"SKU0000002\", \"SKU0000003\"]"));
    
    BasicDBList parsed = (BasicDBList) basicDBObject.get("a");
    assertThat(parsed.size(), is(3));
    assertThat(parsed, containsInAnyOrder("SKU000001", "SKU0000002", "SKU0000003"));
    
  2. 使用JSON解析库读取JSON数组,然后使用反序列化的结果创建BasicDBList,例如::

    List<String> values = new ObjectMapper().readValue("[\"SKU000001\", \"SKU0000002\", \"SKU0000003\"]",
            List.class);
    
    BasicDBList parsed = new BasicDBList();
    values.forEach(s -> parsed.add(s));
    assertThat(parsed.size(), is(3));
    assertThat(parsed, containsInAnyOrder("SKU000001", "SKU0000002", "SKU0000003"));
    

【讨论】:

  • 谢谢。实际上,这就是我想解决的问题,或者只是将 JSON.parse() 与 @suppress 注释一起使用。让我们拭目以待,看看是否有人有任何好的解决方法。
  • 目前看来 Mongo 没有任何解决方案。所以我坚持我的实施。我在其中转换为对象格式的字符串,然后转换为 BasicDBObject,然后从那里获取 BasicDBList。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
相关资源
最近更新 更多