0
votes

Comment convertir un hachage en JSON sans que la chaîne convertie ne soit pleine de barres obliques inverses

Je convertis un hachage en JSON en utilisant to_json , mais la chaîne convertie est pleine de barres obliques inverses. Si j'utilise met , il affiche la chaîne correcte mais si je passe une HTTP :: NET request.body , la chaîne est pleine de barres obliques inverses.

"{"a" => "b", "c" => "d", "e" => "f"}"


9 commentaires

Ce "{" a "=>" b "," c "=>" d "," e "=>" f "}" n'est pas (au moins) un code Ruby valide. Ce que vous voyez plein de barres obliques inverses est une représentation JSON parfaitement facilement analysable de votre hachage.


J'ai besoin d'envoyer une paire valeur / clé sans barre oblique inverse mais au format json. comment vais-je faire ça?


Je suis presque sûr que vous n'avez pas besoin de faire ça. Si vous envoyez un JSON valide, vous recevez un JSON valide que vous devez analyser par la suite. Si vous n'êtes pas satisfait de la façon dont la bibliothèque json de Ruby représente vos chaînes JSON, vous pouvez les créer vous-même ( '{"a": "b", "c": "d", "e": "f"} '== "{\" a \ ": \" b \ ", \" c \ ": \" d \ ", \" e \ ": \" f \ "}" ).


Vous envoyez déjà JSON comme Sebastian l'a mentionné. Les barres obliques inverses sont juste utilisées pour échapper les guillemets doubles dans une chaîne entre guillemets. Si votre demande échoue, cela peut être dû à une autre raison. Je viens d'essayer votre code en irb ça marche, mon application reçoit JSON.


D'accord, merci à tous.


Si vous examinez chaque caractère, par exemple met req.body [0], req.body [1], req.body [2] etc. vous verrez que le troisième caractère slingle est en fait "a". Le deuxième caractère simple est en fait "\" " Les barres obliques ne sont pas vraiment là et pas de caractères supplémentaires, ce sont juste la manière de ruby ​​d'afficher des guillemets doubles intégrés dans une chaîne.


Je suppose que vous ne faites pas JSON.parse à votre réception?


@SafwanSM Essayez JSON.parse ("{\" a \ ": \" b \ ", \" c \ ": \" d \ ", \" e \ ": \" f \ "}") dans la console de rails et vous comprendrez.


Vous confondez les données avec la représentation visuelle des données. data.to_json # => "{\" a \ ": \" b \ ", \" c \ ": \" d \ ", \" e \ ": \" f \ "}" mais met data.to_json renvoie {"a": "b", "c": "d", "e": "f"} ce qui est parfait JSON. Vous pouvez le prouver en utilisant: JSON [data] # => "{\" a \ ": \" b \ ", \" c \ ": \" d \ ", \" e \ ": \" f \ "}" puis JSON [JSON [data]] # => {"a" => "b", "c" => "d", "e" => "f" } qui effectue un aller-retour complet de génération puis d'analyse des données et de retour du hachage.


4 Réponses :


2
votes

Vous pouvez gérer ce problème avec deux solutions: soit vous pouvez analyser le JSON où vous voulez l'utiliser, soit vous pouvez également envoyer du JSON analysé à partir du code Ruby.

{"a"=>"b", "c"=>"d", "e"=>"f"}

Il retournera le résultat comme:

req.body = JSON.parse(data.to_json)

Cela dépend de vous où vous voulez analyser vos données. Si vous voulez analyser sur le frontend, utilisez simplement la fonction d'analyse JSON de jQuery.


2 commentaires

JSON.parse (data.to_json) convertira à nouveau json en hachage.


Bienvenue à SO! La grammaire est très importante sur SO. Veuillez prendre le temps d'utiliser la ponctuation et les majuscules appropriées. SO n'est pas un babillard ou un forum, c'est plutôt un livre de référence en ligne.



2
votes

Il semble que vous soyez confus quant au contenu réel de la chaîne. Les barres obliques inverses font partie de la représentation sous forme de chaîne et ne sont pas réellement dans la chaîne.

Prenons par exemple '"' un seul caractère " . Lorsque vous entrez ceci dans irb, la sortie sera:

data = {"a" => "b", "c" => "d", "e" => "f"}
json = data.to_json
#=> "{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"
puts json
# {"a":"b","c":"d","e":"f"}
#=> nil

À partir du résultat "\" " le " de départ et se terminant par " marquent le début et la fin de la chaîne tandis que \" est un guillemet double échappé et représente un simple ". La raison les guillemets doubles sont échappés parce que vous voulez que Ruby l'interprète comme un caractère ", pas comme la fin de la chaîne.

Vous pouvez afficher le contenu réel de la chaîne sans échappement caractères en l'imprimant sur la console.

puts s
# "
#=> nil

Ici, vous pouvez voir qu'il n'y a pas de barre oblique inverse dans le contenu de la chaîne.


Le il en va de même pour votre appel to_json , qui renvoie une chaîne:

s = '"'
#=> "\""

Comme vous pouvez le voir, il n'y a pas de barre oblique inverse dans le contenu de la chaîne, seulement dans la représentation sous forme de chaîne.


1 commentaires

Je pense que c'est le vrai problème et la solution.



-1
votes

Je comprends parfaitement que la barre oblique est un échappement accepté sur la chaîne, mais il existe des applications qui ne l'acceptent pas IE Amazon Connect.

req.body = JSON.parse (données.to_json)

Fonctionne parfaitement.


0 commentaires

0
votes

Essayez as_json qui pourrait être plus approprié compte tenu de ce que vous essayez. Ceci est une bonne explication pour savoir lequel utiliser et quand . as_json produira json sans échappement.


0 commentaires