【问题标题】:Using JSON with MongoDB?将 JSON 与 MongoDB 一起使用?
【发布时间】:2011-04-18 06:34:28
【问题描述】:

我的应用程序大量使用 JSON 对象(org.json.JSONArray 和朋友)。将这些存储到 Mongo DBObjects 以便可以查询它们的最有效方法是什么? BasicDBObject 无法序列化 JSONArray——这两个层次结构之间似乎根本没有互操作性。

【问题讨论】:

    标签: java json mongodb


    【解决方案1】:

    com.mongodb.util.JSON 具有将 JSON 字符串解析为 DBObject 的方法。 默认的 JSONCallback 会根据输入的字符串返回 BasicDBObject 或 BasicDBList。

    Object jsonObj = ...; //any of your org.json objects
    Object o = com.mongodb.util.JSON.parse(jsonObj.toString());
    DBObject dbObj = (DBObject) o;
    

    【讨论】:

    • com.mongodb.util.JSON 已弃用
    【解决方案2】:

    好吧,似乎没有互操作性,所以我推出了自己的。忙于绕过类型系统:

    public class Util {
        public static DBObject encode(JSONArray a) {
            BasicDBList result = new BasicDBList();
            try {
                for (int i = 0; i < a.length(); ++i) {
                    Object o = a.get(i);
                    if (o instanceof JSONObject) {
                        result.add(encode((JSONObject)o));
                    } else if (o instanceof JSONArray) {
                        result.add(encode((JSONArray)o));
                    } else {
                        result.add(o);
                    }
                }
                return result;
            } catch (JSONException je) {
                return null;
            }
        }
    
        public static DBObject encode(JSONObject o) {
            BasicDBObject result = new BasicDBObject();
            try {
                Iterator i = o.keys();
                while (i.hasNext()) {
                    String k = (String)i.next();
                    Object v = o.get(k);
                    if (v instanceof JSONArray) {
                        result.put(k, encode((JSONArray)v));
                    } else if (v instanceof JSONObject) {
                        result.put(k, encode((JSONObject)v));
                    } else {
                        result.put(k, v);
                    }
                }
                return result;
            } catch (JSONException je) {
                return null;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我不了解 java mongo 驱动程序,但在 c# mongo driver 中有 BsonSerializer 类。 您可以像下面的代码一样使用它:

      var q = BsonSerializer.Deserialize<MyDocument>("{ jsonValueName:jsonValue }"); 
      

      请检查mongo-java-driver,谢谢它应该包含相同的设施

      也看bson4jackson

      【讨论】:

      • 是的,我可以序列化为字符串并反序列化该字符串,但我试图互操作本机对象。不过还是谢谢。
      【解决方案4】:

      这行得通,并提出了一个问题,即为什么 Mongo 人决定使用 Object 返回类型而不是 DBObject:有人知道吗?

      如果您的应用中有大量 JSON,一个不错的选择是使用 Jackson 进行(反)序列化。

      【讨论】:

        猜你喜欢
        • 2021-09-20
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-30
        • 1970-01-01
        • 2018-08-25
        相关资源
        最近更新 更多