2010-12-28 3 views
5

J'utilise la bibliothèque JSON-lib pour java http://json-lib.sourceforge.netÉvasion JSON-lib/conservation des chaînes

Je veux juste ajouter la chaîne simple qui peut ressembler à JSON (mais je ne veux pas la bibliothèque de comprendre automatiquement qu'il pourrait être JSON et juste pour le traiter comme une chaîne). En regardant dans la source de la bibliothèque, je ne peux pas trouver le moyen de le faire sans hacks laid.

exemple:

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

object.toString() nous donnera {"myString":{"dont":"treat it as json"}}

et je veux juste avoir {"myString":"{\"dont\":\"treat it as json\"}"}

Comment y parvenir sans modifier le code source? J'utilise ce morceau de code comme moyen de transport pour les messages de chat des utilisateurs - donc cela fonctionne correctement pour les messages de chat normaux, mais quand l'utilisateur entrera dans le format JSON, il le cassera en raison du comportement par défaut de JSON-lib.

Répondre

4

json-simple offre une méthode JSONObject.escape().

+0

Je viens de réécrire l'application avec json-simple et ça marche très bien, vous n'avez même pas à l'échapper(), par défaut, il traite la chaîne comme une chaîne et ne tente pas de l'analyser comme JSON. La vie est tellement simple avec JSON-simple. –

5

Si je comprends bien la question, je pense que json-lib est unique dans son hypothèse de passage d'une chaîne devant être analysée. D'autres bibliothèques le traitent généralement comme une chaîne à inclure (avec l'échappement des guillemets et des barres obliques inverses si nécessaire), c'est-à-dire que vous travaillez comme prévu.

Donc, vous pouvez envisager d'autres bibliothèques: je recommanderais Jackson, Gson fonctionne également.

+0

Correct, json-lib essayera toujours d'abord d'analyser la chaîne: if (JSONUtils.isString (value)) { String str = String.valueOf (value); if (JSONUtils.hasQuotes (str)) { String stripped = JSONUtils.stripQuotes (str); si (JSONUtils.isFunction (dénudée)) { ...} si (stripped.startsWith ("[") && stripped.endsWith ("]")) { ...} si (dépouillé. startsWith ("{") && stripped.endsWith ("}")) { ... } return str; } –

+0

Ok. C'est une approche assez intéressante ... cela ne me semble pas intuitif, mais peut-être que c'est ce qui a fonctionné pour les cas d'utilisation de l'auteur de json-lib. – StaxMan

+0

Par ma question http://stackoverflow.com/questions/6155560/how-to-force-json-libs-jsonobject-put-to-escape-a-string-containing-json - sommes-nous absolument sûrs qu'il n'y a aucun moyen de accomplir ce comportement avec JSON-lib? Je voudrais * vraiment * éviter d'échanger ce dep. –