2011-04-12 18 views
13

Jackson'ın giriş JSON'a daha az sıkılaştırılmasını sağlamanın bir yolu var mı? Örneğin. JSONObject nesnesi şu karşılıklar ayrılmakta:Jackson'ı giriş için daha kolay hale getirin JSON

kurucular kabul edecekleri metinlerde daha bağışlayıcı şunlardır:

  1. Fazladan, (virgül) hemen Kapanış ayracı önce görünebilir.
  2. Dizeler '(tek tırnak) ile alıntı yapılabilir.
  3. Dizeler, bir alıntı veya tek bir alıntıyla başlamıyorsa ve baştaki veya sondaki boşluk içermiyorsa ve bu karakterlerden hiçbirini içermiyorsa alıntılanmasına gerek yoktur: {} []/\:, =; # sayıları gibi görünmüyorlar ve ayrılmış sözcükler doğru değilse, false veya null değilse. *
  4. Anahtarlar şu şekilde olabilir: = veya => yanı sıra:.
  5. Değerler; (noktalı virgül) yanı sıra, (virgül).
  6. Sayılar 0x- (onaltılık) önekine sahip olabilir.

Benim için en ilgi çekici olan 3 noktadır. Aşağıdaki dönüşüm sağlar:

new JSONObject("{A : 1}"); 

... ama jackson için aynı giriş json ile bir hata mesajı görüntülenir:

new ObjectMapper().readTree("{ A : 1}"); // throws an exception 

İstisna:

org.codehaus.jackson.JsonParseException: Unexpected character ('A' (code 65)): was expecting double-quote to start field name 
    at [Source: [email protected]; line: 1, column: 4] 
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:943) 
at org.codehaus.jackson.impl.JsonParserBase._reportError(JsonParserBase.java:636) 
at org.codehaus.jackson.impl.JsonParserBase._reportUnexpectedChar(JsonParserBase.java:569) 
at org.codehaus.jackson.impl.ReaderBasedParser._handleUnusualFieldName(ReaderBasedParser.java:342) 
at org.codehaus.jackson.impl.ReaderBasedParser._parseFieldName(ReaderBasedParser.java:235) 
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:125) 
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:180) 
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeAny(JsonNodeDeserializer.java:210) 
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:52) 
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:13) 
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588) 
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1130) 

cevap

12

Standart olmayan JSON için uzantıların listesi (örn. JSON olmayan öğeler) (ancak desteklenebilecek kadar yakındır) şu adreste bulunabilir: http://wiki.fasterxml.com/JacksonFeaturesNonStandard

Listenizden (2) ve (3) yapılabilir (artılar, commnets gibi listelenmeyen diğer birkaç şey). Diğerleri desteklenmez; ve her ne kadar proje yaygın olarak kullanılan bazı uzantılara destek sağlamış olsa da, dikkate alınacak olan sınırlar vardır. Elbette yeni özellikler sormak her zaman mümkündür; özellikler istek üzerine eklenir, kullanım durumları.

Kişisel görüşüme göre ya standardı takip etmeli ya da yeni formatlar tanımlanmalı - HTML, "neredeyse ama tam olarak değil" olan şeyleri desteklemeye çalışırken ortaya çıkan sıçan deliklerinin iyi bir örneğidir. Düzeltmelerin sonu yoktur ve birlikte çalışabilirlik acı çeker: standart olmadığından, tüm uygulamalar bazı uyumlu olmayan özellik ve yapı alt kümelerini destekler.

4

dışarı Kontrol this ilgili soru. Ne yapmak istediğinizi yapmak için bir ObjectMapper'u nasıl yapılandıracağınızı gösterir ve neden bunu yapmak istemeyeceğiniz hakkında bazı iyi tartışmalar da vardır :)

İlgili konular