2010-12-28 25 views
5

que estoy usando la biblioteca JSON para Java http://json-lib.sourceforge.netJSON-lib Escapar/cuerdas preservando

sólo quiero añadir cadena simple que puede parecer como JSON (pero no quieren biblioteca para averiguar automáticamente que podría be json y solo para tratarlo como una cuerda). Buscando en la fuente de la biblioteca no puedo encontrar la manera de hacerlo sin feos hacks.

ejemplo:

JSONObject object = new JSONObject(); 
String chatMessageFromUser = "{\"dont\":\"treat it as json\"}"; 
object.put("myString", chatMessageFromUser); 

object.toString() nos dará {"myString":{"dont":"treat it as json"}}

y quiero sólo para tener {"myString":"{\"dont\":\"treat it as json\"}"}

Cómo lograrlo sin modificar el código fuente? Estoy usando este fragmento de código como transporte para los mensajes de chat de los usuarios, por lo que funciona bien para los mensajes de chat normales, pero cuando el usuario ingresa el formato JSON como mensaje, lo romperá debido al comportamiento predeterminado de JSON-lib descrito aquí.

Respuesta

4

json-simple ofrece un método JSONObject.escape().

+0

Acabo de volver a escribir la aplicación con json-simple y funciona muy bien, ni siquiera tiene que escapar(), por defecto trata cadena como cadena y no intenta analizarla como JSON. La vida es muy simple con json-simple. –

5

Si entiendo correctamente la pregunta, creo que json-lib es único en su asunción de que se debe analizar un String que se debe pasar. Otras bibliotecas suelen tratarlo como Cadena para incluir (con el escape de comillas dobles y barras diagonales inversas según sea necesario), es decir, trabaje como era de esperar.

Así que es posible que desee considerar otras bibliotecas: Yo recomendaría Jackson, Gson también funciona.

+0

Correcto, json-lib siempre intentará primero analizar la cadena: if (JSONUtils.isString (value)) { String str = String.valueOf (value); if (JSONUtils.hasQuotes (str)) { String stripped = JSONUtils.stripQuotes (str); si (JSONUtils.isFunction (pelado)) {} ... si (stripped.startsWith ("[") && stripped.endsWith ("]")) {} ... si (despojado. startsWith ("{") && stripped.endsWith ("}") { ... } return str; } –

+0

Ok. Este es un enfoque bastante interesante ... parece poco intuitivo para mí, pero tal vez fue lo que funcionó para los casos de uso del autor json-lib. – StaxMan

+0

Según mi pregunta http://stackoverflow.com/questions/6155560/how-to-force-json-libs-jsonobject-put-to-escape-a-string-containing-json, ¿estamos absolutamente seguros de que no hay forma de lograr este comportamiento con JSON-lib? Me gustaría * realmente * evitar el intercambio de ese depósito. –

Cuestiones relacionadas