JSON et caractères d’échappement

J’ai une chaîne qui est sérialisée en JSON en Javascript, puis désérialisée en Java.

Il semble que si la chaîne contient un symbole de degré, je reçois un problème.

Je pourrais utiliser une aide pour savoir à qui blâmer:

  • est-ce l’implémentation de Spidermonkey 1.8? (ceci a une implémentation JSON intégrée)
  • est-ce Google gson ?
  • est-ce moi pour ne pas faire quelque chose correctement?

Voici ce qui se passe dans JSDB:

js>s='15\u00f8C' 15°C js>JSON.ssortingngify(s) "15°C" 

Je m’attendrais à "15\u00f8C' qui m’amène à croire que l’implémentation JSON de Spidermonkey ne fait pas ce qu’il faut … sauf que la description de la syntaxe de la page d’accueil JSON (est-ce la spécification?)

any-Unicode-character- sauf – “- ou – \ – ou-caractère de contrôle”

alors peut-être qu’il passe la chaîne en tant que telle sans l’encoder comme \ u00f8 … auquel cas je pense que le problème vient de la bibliothèque gson.

Quelqu’un peut-il aider?

Je suppose que ma solution de contournement consiste à utiliser soit une bibliothèque JSON différente, soit à échapper manuellement des chaînes après avoir appelé JSON.ssortingngify() – mais si cela est un bogue, je voudrais déposer un rapport de bogue.

Ce n’est pas un bogue dans les deux implémentations. Il n’est pas nécessaire d’échapper à U + 00B0. Pour citer la RFC :

2.5. Cordes

La représentation des chaînes est similaire aux conventions utilisées dans la famille C des langages de programmation. Une chaîne commence et se termine par des guillemets. Tous les caractères Unicode peuvent être placés entre guillemets, à l’exception des caractères qui doivent être échappés: guillemet, inversion solidus et les caractères de contrôle (U + 0000 à U + 001F).

Tout personnage peut être échappé.

Tout échapper gonfle la taille des données (tous les points de code peuvent être représentés en quatre octets ou moins dans tous les formats de transformation Unicode, tandis que leur codage en fait tous six ou douze octets).

Il est plus probable que vous ayez un bogue de transcodage de texte quelque part dans votre code et que tout échappement dans le sous-ensemble ASCII masque le problème. La spécification JSON exige que toutes les données utilisent un codage Unicode.

hmm, eh bien, voici une solution:

 function JSON_ssortingngify(s, emit_unicode) { var json = JSON.ssortingngify(s); return emit_unicode ? json : json.replace(/[\u007f-\uffff]/g, function(c) { return '\\u'+('0000'+c.charCodeAt(0).toSsortingng(16)).slice(-4); } ); } 

cas de test:

 js>s='15\u00f8C 3\u0111'; 15°C 3◄ js>JSON_ssortingngify(s, true) "15°C 3◄" js>JSON_ssortingngify(s, false) "15\u00f8C 3\u0111"