ALLOW_UNQUOTED_FIELD_NAMES dans la bibliothèque jackon JSON
Je suis en utilisant le jackson bibliothèque de sérialisation/désérialisation vers/à partir de JSON. J'ai besoin que ce JSON a la plus petite taille possible, j'ai donc activé la fonctionnalité ALLOW_UNQUOTED_FIELD_NAMES pour éliminer toutes les citations. Je sais que la suppression des guillemets n'est pas standard, json, mais de faire en json petit est un dur exigence du projet. Le json généré fonctionne, mais quand j'ai essayer de lire la valeur json j'obtiens une exception:
org.codehaus.jackson.JsonParseException:
Caractère inattendu ('9' (code 57)):
m'attendais soit valide, le nom de
caractère (pour les sociétés non cotées nom) ou
double-quote (cité) pour commencer
nom du champ à [Source:
java.io.StringReader@1347d75; ligne: 1,
colonne: 3]
L'exception ci-dessus est levée lorsque j'ai lu ce json:
{90110a2e-febd-470f-afa4-cf7e890d31b9:0,eec652ad-a4d9-4eb1-8d24-7c1a0c29449f:1}
La façon dont je lis c'est:
Map<String, Object> valuesMap = oM.readValue(json, new TypeReference<Map<String, Object>>() {});
et l'objet mappeur-je utiliser à la fois pour la lecture et l'écriture des valeurs est:
private static final ObjectMapper om = new ObjectMapper();
static {
om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
om.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
om.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
om.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}
J'utilise la version 1.6.3 de Jackson, à la fois l'expéditeur et le récepteur projets. Le besoin de la version de cette fonctionnalité est de 1,2+ donc j'ai pensé que peut-être que je n'utilisais pas cette version, mais mon récepteur est un Ressort de l'application et j'ai vérifié que la bibliothèque installée dans le dossier libs est 1.6.3.
Ce que je fait de mal? Peut-être que cette fonctionnalité ne peut pas être utilisé avec des cartes.
J'ai une autre question, jusqu'à présent, je suis juste l'envoi d'une carte ou de la clé est juste un uuid de la valeur et de la valeur est un nombre. Puis-je avoir des problèmes si je m'en envoyer une valeur avec des caractères spéciaux avec ALLOW_UNQUOTED_FIELD_NAMES fonctionnalité? Sera jackson échapper à ces personnages?
Grâce.
source d'informationauteur Javi | 2011-01-27
Vous devez vous connecter pour publier un commentaire.
Semble que Jackson avec
QUOTE_FIELD_NAMES
dans certains cas le produit de cette sortie qu'il ne peut pas lire lui-même, même avecALLOW_UNQUOTED_FIELD_NAMES
. Vous aurez probablement besoin de mettre en œuvre personnaliséeJsonParser
pour les non-entrée standard de l'analyse.Le problème, c'est que vous êtes la génération non-standard JSON et il n'y a aucune garantie que le client va le gérer correctement. Toutefois, si vous n'avez pas l'exposer à l'extérieur de votre application(s) et se soucient de la taille de choses dont on pourrait analyser/générer le format binaire comme Jackson Sourire. Voir http://www.cowtowncoder.com/blog/archives/2010/09/entry_418.html (2.4).
Ok, Pingw33n la réponse est à peu près correct je pense. Donc: oui, vous pouvez utiliser la fonction; mais il est plutôt heuristique -- puisqu'il n'existe aucune spécification quant à la façon non cotées les noms de travail (après tout, JSON permet à toute et tous les caractères pour les noms!); ou, si aucun mécanisme d'échappement est utilisée, c'est n'importe qui conjecture quant à ce qui devrait être écrit ou accepté.
Dans ce cas particulier, il est probablement le caractère '-' que les causes d'un problème. Ce n'est pas une partie juridique de Javascript nom, qui est le rapprochement Jackson utilise.
Une solution possible serait de Jackson pour échapper à de tels caractères dans les noms de propriétés (je ne me souviens pas comment il se fait actuellement; si l'un des caractères de nom sont cités). Si vous pouvez trouver un simple cas de test, vous pouvez déposer une Jira demande de enchancement à Jackson Jira pour obtenir échapper ajoutée (et de s'assurer de l'analyseur peut ne pas encoder la barre oblique inverse d'habitude version).
Je crois que le problème est lié à Javascript sintax et de ne pas Jackson, ni JSON.
En Javascript, un nom est une lettre suivie éventuellement d'une ou de plusieurs lettres, des chiffres ou des underbars, donc 90110a2e-febd-470f-afa4-cf7e890d31b9 n'est pas un Javascript nom.
Les guillemets autour d'une propriété du nom sont facultatifs si le nom légale JavaScript nom et pas un mot réservé. Si les guillemets sont nécessaires autour de "prénom", mais sont facultatifs autour de prenom.
BTW, si vous êtes si préoccupé JSON taille, pourquoi ne pas vous gzip?