【问题标题】:BSON to JSON conversion using MongoDB Driver Java API使用 MongoDB Driver Java API 将 BSON 转换为 JSON
【发布时间】:2019-02-28 00:09:50
【问题描述】:

我正在使用 MongoDB Driver Java API 将 BSON 转换为 JSON。 我有这样的测试代码。

String input = "{ \"timestamp\" : 1486064586641 }";
org.bson.Document doc = org.bson.Document.parse(input);
System.out.println("input  = " + input);
System.out.println("output = " + doc.toJson());

输出是:

input  = { "timestamp" : 1486064586641 }
output = { "timestamp" : { "$numberLong" : "1486064586641" } }

有没有一种简单的方法可以让输出看起来像输入?

【问题讨论】:

    标签: json mongodb bson


    【解决方案1】:

    BSON Documnet 的 toJson 方法只支持输出到MongoDB Extended JSON(STRICT 或 SHELL 格式)。如果你想有常规的 JSON,你可以使用 com.mongodb.util.JSON 类:

    String input = "{ \"timestamp\" : 1486064586641 }";
    org.bson.Document doc = org.bson.Document.parse(input);
    System.out.println("input  = " + input);
    System.out.println("output (SHELL) = " + doc.toJson(new JsonWriterSettings(JsonMode.SHELL)));
    System.out.println("output (STRICT) = " + doc.toJson(new JsonWriterSettings(JsonMode.STRICT)));
    System.out.println("output (JSON) = " + com.mongodb.util.JSON.serialize(doc));
    

    这将生成以下输出:

    input  = { "timestamp" : 1486064586641 }
    output (SHELL) = { "timestamp" : NumberLong("1486064586641") }
    output (STRICT) = { "timestamp" : { "$numberLong" : "1486064586641" } }
    output (JSON) = { "timestamp" : 1486064586641}
    

    【讨论】:

    • 我的 ObjectId 有问题。如果输入 = "{ \"timestamp\" : 1486064586641, \"_id\": {\"$oid\": \"58dd09687b4e7f108f9e7a2f\"} }" 会怎样。使用 JSON.serialize 我得到这个结果:{“timestamp”:1486064586641,“_id”:{“$oid”:“58dd09687b4e7f108f9e7a2f”}}。时间戳没问题,除了_id
    • 是的,但为什么会出现问题? JSON 不会以任何特殊方式处理 $oid,您可以添加类似 "\"aaa\": {\"bbbb\": \"ccc\"}" 的内容来代替 $oid - 结果将非常相似。您希望拥有什么?
    • 谢谢 Natalja,我创建了问题:stackoverflow.com/questions/43328955/…
    【解决方案2】:

    Natalja 的回答非常好,但如果您使用的是 Mongo Java 驱动程序 3.8.2 以上版本,您会注意到一些弃用警告。如果您希望输出看起来像输入,您可以使用RELAXED JsonWriterSettings 模式。

    您可以在下面看到一个示例,其中包含可能的模式以及 JSON 的外观。还有一些弃用警告和弃用代码的替代方案:

    String input = "{ \"timestamp\" : 1486064586641 }";
    org.bson.Document doc = org.bson.Document.parse(input);
    System.out.println("input  = " + input);
    JsonWriterSettings shellMode = JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build();
    System.out.println("output (SHELL) = " + doc.toJson(shellMode));
    JsonWriterSettings strictMode = JsonWriterSettings.builder().outputMode(JsonMode.STRICT).build();
    System.out.println("output (STRICT) = " + doc.toJson(strictMode)); // deprecated - use extended like below
    JsonWriterSettings extendedMode = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build();
    System.out.println("output (EXTENDED) = " + doc.toJson(extendedMode));
    JsonWriterSettings relaxed = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build();
    System.out.println("output (RELAXED) = " + doc.toJson(relaxed));
    
    System.out.println("output (JSON) = " + com.mongodb.util.JSON.serialize(doc)); // deprecated - use relaxed like above    
    

    另请注意,JsonWriterSettings 构造函数已被弃用,您可以使用构建器方法作为替代方法,例如:

    JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2021-11-26
      • 2016-02-14
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多