Mongo Java 驱动程序 3.6.1 - 如何将 json 数组结构化字符串解析为 BasicDBList
Mongo Java Driver 3.6.1 - How to parse a json array structured String to BasicDBList
当我使用 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
?
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 数组。相反,您的选择是:
通过在有效的 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"));
使用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"));
当我使用 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
?
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 数组。相反,您的选择是:
通过在有效的 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"));
使用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"));