0

我有一个扩展的 json 字符串。

{"_id": {"oid": "59a47286cfa9a3a73e51e72c"}, "theaterId": {"numberInt": "101100"}, "location": {"address": {"street1": "340 XDW Market", "city": "Bloomington", "state": "MN", "zipcode": "12427"}, "geo": {"type": "Point", "coordinates": [{"$numberDouble": "-193.24565"}, {"$numberDouble": "144.85466"}]}}}

尝试将上述 json 字符串转换为文档以便将其插入 MongoDB。为此,我使用org.bson.Document.Document.parse(json_string)构造函数。

但是我在解析后得到的文档并没有保留geo.coordinatearraylist 中的数据类型(检查下面的文档)。虽然它保留theaterId.

{
    "_id": {
        "oid": "59a47286cfa9a3a73e51e72c"
    },
    "theaterId": {
        "numberInt": "101100"
    },
    "location": {
        "address": {
            "street1": "340 XDW Market",
            "city": "Bloomington",
            "state": "MN",
            "zipcode": "12427"
        },
        "geo": {
            "type": "Point",
            "coordinates": [-193.24565, 144.85466]
        }
    }
}

这是 Document.parse() API 中的潜在问题吗?

4

1 回答 1

1

您的字段geo.coordinate以美元符号开头$。在 theatreId 你有numberInt,而在坐标 - $numberDouble

检查文档这个问题,了解如何根据您的需要处理它。考虑到它看起来numberInt可以满足您的需求,您可能只需要从字段名称中删除美元。

编辑:在深入研究这些文档之后,您也提供的文档{"numberInt": "101100"}不是具有数据类型的扩展 json,它只是具有该属性的属性和值的普通 json 对象。它需要{"$numberInt": "101100"}被扩展json。另一方面{"$numberDouble": "-193.24565"} 延伸。数据类型不会丢失,它会被解析为List<Double>,因为我们知道每个元素Double的类型都可以重新构建数据类型。

如果您使用 at Document.toJson(),则它在引擎盖下使用RELAXED输出模式,它将在您看到它们时输出坐标 - [-193.24565, 144.85466]。如果您提供EXTENDED输出模式,例如这样:

JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build();
System.out.println(document.toJson(settings));

然后数据类型将从 java 类型重建回来,坐标将如下所示:

[{"$numberDouble": "-193.24565"}, {"$numberDouble": "144.85466"}]

总之, 没有问题Document.parse("json"),但您提供给它的 json 可能有问题。

Edit2: 如示例中所示,可以从 java 类型重建数据类型。我不熟悉collection.insertOne(Document.parse(json_string))引擎盖下的工作方式,但如果你没有明确指定模式,它可能RELAXED默认使用,而不是EXTENDED. 这里的文档状态 - This format prioritizes type preservation at the loss of human-readability and interoperability with older formats.,所以这是有道理的。但这只是我的一个疯狂猜测,您需要深入研究文档才能确定。

于 2022-02-25T10:13:12.223 回答