2010-12-28 12 views
5

Sadece JSON benzeyebilir basit dize eklemek istiyorum (ama otomatik olabilir anlamaya kitaplığı istemiyoruz json ol ve sadece ip gibi davran. Kütüphane kaynağına bakıyorum Çirkin hack olmadan bunu yapmanın yolunu bulamıyorum.JSON-lib kaçış/koruyarak dizeleri

örnek:

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

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

bize verecek ve ben sadece {"myString":"{\"dont\":\"treat it as json\"}"}

Nasıl kaynak kodunu değiştirmeden bunu başarmak için istiyorum? Bu kod parçasını, kullanıcılardan gelen sohbet mesajları için taşıma olarak kullanıyorum - bu yüzden normal sohbet mesajları için işe yaramaz, ancak kullanıcı JSON formatına mesaj olarak girdiğinde, burada açıklanan JSON-lib'in varsayılan davranışı nedeniyle bozulacaktır.

cevap

4

json-simple, JSONObject.escape() yöntemini sunmaktadır.

+0

Uygulamayı json-simple ile yeniden yazdım ve harika çalışıyor, hatta kaçmak zorunda değilsiniz(), varsayılan olarak dizeyi string olarak ele alır ve JSON olarak ayrıştırmaya çalışmaz. Hayat json-basit ile çok basit. –

5

Soruyu doğru anlıyorsam, json-lib'in ayrıştırılması gereken bir String varsayımıyla benzersiz olduğunu düşünüyorum. Diğer lib'lar tipik olarak bunu içermek için String olarak (gerektiğinde çift tırnak ve ters eğik çizgi kaçarak), yani beklediğiniz gibi çalışır.

Diğer kütüphaneleri düşünmek isteyebilirsiniz: Jackson'u öneririm, Gson da çalışır.

+0

Doğru, json-lib her zaman dizeyi ayrıştırmak için her zaman dener: (JSONUtils.isString (value)) { Dize str = String.valueOf (value); if (JSONUtils.hasQuotes (str)) { Dize stripped = JSONUtils.stripQuotes (str); halinde (JSONUtils.isFunction (sıyrılmış)) { ... } halinde (stripped.startsWith ("[") && stripped.endsWith ("]")) { ... } halinde (sıyrılmıştır. başlarWith ("{") && stripped.endsWith ("}")) { ... } str; } –

+0

Tamam. Bu oldukça ilginç bir yaklaşım ... bana mantıksız geliyor, ama belki de json-lib yazarının kullanım durumları için çalışmıştı. – StaxMan

+0

Soruma göre http://stackoverflow.com/questions/6155560/how-to-force-json-libs-jsonobject-put-to-escape-a-string-containing-json - yolun hiçbir şekilde olduğundan emin değiliz Bu davranışı JSON-lib ile başarmak? Bu deposu değiştirmekten kaçınmayı çok isterim. –