Rendere Jackson più amichevole per l’ingresso JSON

Non ho un modo per rendere Jackson meno esigenti per l’ingresso JSON. E. g. JSONObject offre i seguenti indennità:

I costruttori sono più indulgente nei testi accettati:

  1. Un extra , (virgola) può apparire poco prima della parentesi graffa di chiusura.
  2. Stringhe possono essere citate con ‘ (apice singolo).
  3. Stringhe non hanno bisogno di essere quotato a tutti se non iniziare con una citazione o la singola offerta, e se non contengono spazi iniziali o finali, e se non contengono uno di questi caratteri: { } [ ] /\ : , = ; # e se non l’aspetto di numeri e se non sono le parole riservate true, false o null.*
  4. Tasti può essere seguito da = o => nonché by :.
  5. Valori possono essere seguiti da ; (punto e virgola) come anche da una virgola (,).
  6. Numeri possono avere la 0x- (hex) prefisso.

Più interessante per me è il 3 ° punto. Permette di conversione seguenti:

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

… ma per jackson mi esce un errore con lo stesso ingresso json:

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

Eccezione:

org.codehaus.jackson.JsonParseException: Unexpected character ('A' (code 65)): was expecting double-quote to start field name
   at [Source: java.io.[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)
InformationsquelleAutor Raman | 2011-04-12

 

2 Replies
  1. 12

    Elenco delle estensioni non standard JSON (cioè roba che NON è JSON, ma è abbastanza vicino che si può essere supportato) può essere trovato da: http://wiki.fasterxml.com/JacksonFeaturesNonStandard

    Dal tuo elenco, (2) e (3) può essere fatto (più un paio di altre cose, non quotate, come commnets). Gli altri non sono supportati; e anche se il progetto ha aggiunto il supporto per alcune estensioni che sono comunemente usati, non ci sono limiti a ciò che sarà preso in considerazione. È sempre possibile richiedere nuove funzionalità di corso; vengono aggiunte funzionalità di base, su richiesta, i casi di utilizzo.

    A mio personale parere si dovrebbe seguire lo standard, o definire nuovi formati HTML è un buon esempio di buchi di ratto si ottiene quando si cerca di sostenere le cose che sono “quasi, ma non del tutto valido. Non c’è fine a modifiche, e l’interoperabilità soffre: dal momento che non c’è uno standard, tutte le implementazioni di supporto non compatibile sottoinsiemi di funzioni e costrutti.

  2. 4

    Check out questo relativa questione. Essa mostra come configurare un ObjectMapper per fare quello che vuoi, e ha anche qualche buona discussione su perché non si potrebbe desiderare di farlo 🙂

Lascia un commento