【问题标题】:Creating BSON object from JSON string从 JSON 字符串创建 BSON 对象
【发布时间】:2011-03-08 05:26:00
【问题描述】:

我有一个从外部应用程序获取数据的 Java 应用程序。传入的 JSON 是字符串。我想解析字符串并创建 BSON 对象。

不幸的是,我在 Java 的 BSON 实现中找不到 API。

我是否使用过像 GSON 这样的外部解析器?

【问题讨论】:

  • 谢谢汉克的回答。我将使用 Jakcson,因为我认为 GSON 无法从对象创建地图。
  • 我也找不到这样做的方法,尽管他们的JsonObject 为您提供了获得Set<Map.Entry> 的方法;我想知道他们为什么做出这个特别的决定。

标签: java json mongodb bson


【解决方案1】:

最简单的方法似乎是使用 JSON 库将 JSON 字符串解析为 Map,然后使用 putAll 方法将这些值放入 BSONObject

This answer 展示了如何使用 Jackson 将 JSON 字符串解析为 Map

【讨论】:

    【解决方案2】:

    您可能对bson4jackson 项目感兴趣,该项目允许您使用 Jackson 数据绑定来处理 BSON(从 BSON 创建 POJO,写为 BSON)——尤其是因为 Jackson 也使用 JSON。所以它可以像你提到的那样进行转换,只需使用不同的 ObjectMapper 实例(一个适用于 JSON,另一个适用于 BSON)。

    使用 Jackson,您既可以使用完整的 POJO(声明您想要的结构),也可以使用简单的地图、列表等。读取数据时只需要声明要绑定的类型(写入时,类型由您传递的对象定义)。

    【讨论】:

      【解决方案3】:

      我不确定 java 但 mongoDB CPP 驱动程序有一个函数类型

      BSONObj fromjson(字符串)

      根据传递的字符串返回一个 BSONObj。 Java中应该也有同样的功能。

      【讨论】:

        【解决方案4】:

        您可以在https://github.com/mongodb/mongo/blob/master/src/mongo/db/jsobj.cpp的源代码中找到问题的答案 其中有 BSON 到 JSON 的转换。

        基本上,像

        • ObjectId("XXX") -> { "$oid" : "XXX" }
        • /XXX/gi -> { "$regex" : "XXX", "$options" : "gi" }

        等等……

        【讨论】:

          【解决方案5】:

          官方的 MongoDB Java 驱动附带了将 JSON 解析为 BSON 并将 BSON 序列化为 JSON 的实用方法。

          import com.mongodb.DBObject;
          import com.mongodb.util.JSON;
          
          DBObject dbObj = ... ;
          String json = JSON.serialize( dbObj );
          DBObject bson = ( DBObject ) JSON.parse( json );
          

          驱动可以在这里找到:https://mongodb.github.io/mongo-java-driver/

          【讨论】:

          • 在 C# 中是否有任何替代品可用?
          • @Sunny这个问题是关于Java的,我对C#一窍不通,看一下Mongo C#驱动源码,肯定有上面那种实用方法
          • 我确信这对 Sunny 来说已经太晚了,但对于任何其他偶然发现这个问题的人来说,C# 中的等价物只是 BsonDocument.Parse
          【解决方案6】:

          要将字符串 json 转换为 bson,请执行以下操作:

          import org.bson.BasicBSONEncoder;
          import org.bson.BSONObject;
          
          BSONObject bson = (BSONObject)com.mongodb.util.JSON.parse(string_json);
          BasicBSONEncoder encoder = new BasicBSONEncoder();
          byte[] bson_byte = encoder.encode(bson);
          

          要将 bson 转换为 json,请执行以下操作:

          import org.bson.BasicBSONDecoder;
          import org.bson.BSONObject;
          
          BasicBSONDecoder decoder = new BasicBSONDecoder();
          BSONObject bsonObject = decoder.readObject(out);
          String json_string = bsonObject.toString();
          

          【讨论】:

            【解决方案7】:

            ...而且,从 3.0.0 开始,您可以:

            import org.bson.Document;
            
            final Document doc = new Document("myKey", "myValue");
            final String jsonString = doc.toJson();
            final Document doc = Document.parse(jsonString);
            

            官方文档:

            【讨论】:

              【解决方案8】:

              我建议使用 BasicDBObject 的 toJson() 和 parse(String) 方法,因为 JSON 实用程序类已被 @Depriated。

              import com.mongodb.BasicDBObject;
              
              public static BasicDBObject makeBsonObject(String json) {
                  return BasicDBObject.parse(json);
              }
              
              public static String makeJsonObject(BasicDBObject dbObj) {
                  return dbObj.toJson();
              }
              

              【讨论】:

                【解决方案9】:

                使用org.bson.Document 中的Document.parse(String json)。它返回Document 类型为Bson 的对象。

                【讨论】:

                • 我不明白为什么这不是公认的答案。我显然误解了这个问题。
                • @TomQuarendon 可能是因为这个答案已在问题发布 8 年后发布。即使 yair 的答案基本相同,但在 3 年前发布,也没有被选为接受的答案。
                猜你喜欢
                • 1970-01-01
                • 2022-01-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-08-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多