2011-04-18 20 views
18

Mi aplicación utiliza mucho los objetos JSON (org.json.JSONArray y amigos). ¿Cuál es la forma más eficiente de almacenar estos en Mongo DBObjects para que puedan ser consultados? BasicDBObject no puede serializar un JSONArray; parece que no hay interoperabilidad entre estas dos jerarquías.¿Cómo usar JSON con MongoDB?

Respuesta

8

bien parece que no hay interoperabilidad, así que rodó el mío. Busywork de moverse por el sistema de tipos:

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; 
     } 
    } 
} 
0

no sé sobre el controlador de java mongo, pero en c# mongo driver tiene la clase BsonSerializer. Se puede utilizar como código siguiente:

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

cheque del PLZ mongo-java-driver, agradezco que debe contener las mismas instalaciones

también mira bson4jackson

+0

Sí, podría serializar una cadena y deserializar la cadena, pero estaba tratando de interoperar con los objetos nativos. Gracias sin embargo. – Simon

28

com.mongodb.util.JSON tiene un método para analizar una cadena JSON en dbobject. La JSONCallback predeterminada devolverá un BasicDBObject o BasicDBList de acuerdo con la cadena de entrada.

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

Esto funciona, y lanza la pregunta de por qué la gente Mongo decidido tener un objeto tipo de retorno en lugar de un dbobject: ¿alguien sabe?

Una buena alternativa, si tiene una gran cantidad de JSON en su aplicación, sería usar Jackson para la (de) serialización.

Cuestiones relacionadas