2010-12-28 3 views
5

sto utilizzando la libreria JSON-lib per Java http://json-lib.sourceforge.netJSON-lib Fuggi-fuggi/conservazione stringhe

voglio solo aggiungere semplice stringa che può apparire come JSON (ma io non voglio libreria per capire automaticamente che potrebbe essere json e giusto per trattarlo come stringa). Guardando nella fonte della biblioteca non riesco a trovare il modo di farlo senza brutti hack.

esempio:

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

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

e voglio solo avere {"myString":"{\"dont\":\"treat it as json\"}"}

Come raggiungerlo senza modificare il codice sorgente? Sto usando questo pezzo di codice come trasporto per i messaggi di chat dagli utenti - quindi funziona correttamente per i normali messaggi di chat, ma quando l'utente entrerà nel formato JSON come messaggio lo interromperà a causa del comportamento predefinito di JSON-lib descritto qui.

risposta

4

json-simple offre un metodo JSONObject.escape().

+0

Ho appena riscritto l'applicazione con json-simple e funziona benissimo, non è nemmeno necessario eseguire l'escape(), per impostazione predefinita tratta la stringa come stringa e non tenta di analizzarla come JSON. La vita è così semplice con Json-semplice. –

5

Se ho letto correttamente la domanda, penso che json-lib sia unico nella sua ipotesi che una stringa passata debba essere analizzata. Altre librerie lo trattano tipicamente come Stringa da includere (con l'escaping di virgolette e barre rovesciate se necessario), cioè funzionano come ci si aspetterebbe.

Quindi si consiglia di prendere in considerazione altre librerie: vorrei raccomandare Jackson, Gson funziona anche.

+0

Corretto, json-lib proverà sempre prima ad analizzare la stringa: if (JSONUtils.isString (valore)) { String str = String.valueOf (value); if (JSONUtils.hasQuotes (str)) { String stripped = JSONUtils.stripQuotes (str); se (JSONUtils.isFunction (spogliata)) { ...} se (stripped.startsWith ("[") && stripped.endsWith ("]")) { ...} se (spogliato. startsWith ("{") && stripped.endsWith ("}")) { ... } return str; } –

+0

Ok. Questo è un approccio abbastanza interessante ... a me sembra non intuitivo, ma forse era quello che funzionava per i casi d'uso dell'autore di json-lib. – StaxMan

+0

Per la mia domanda http://stackoverflow.com/questions/6155560/how-to-force-json-libs-jsonobject-put-to-escape-a-string-contain-json - siamo assolutamente certi che non ci sia modo di realizzare questo comportamento con JSON-lib? Mi piacerebbe davvero * * * evitare di scambiare quel dep. –