2017-06-07 1 views
0

j'ai essayé d'analyser les données de carte elixir converti en JSON en utilisant Poison.encode(), en tout cas, je me suis erreur:jeton inattendu et JSON lorsque l'objet de l'analyse syntaxique chaîne

Unexpected token & in JSON at position 1 

Comment échapper à double citations à l'intérieur de cette chaîne, pour éviter d'ajouter "&quote;"?

données initiales:

%{"[email protected]" => ["40000000-5fffffff", "a0000000-bfffffff"], 
    "[email protected]" => ["20000000-3fffffff", "a0000000-bfffffff"], 
    "[email protected]" => ["20000000-3fffffff", "80000000-9fffffff"], 
    "[email protected]" => ["20000000-3fffffff", "80000000-9fffffff", 
    "e0000000-ffffffff"], 
    "[email protected]" => ["00000000-1fffffff", "80000000-9fffffff", 
    "e0000000-ffffffff"], 
    "[email protected]" => ["00000000-1fffffff", "60000000-7fffffff", 
    "e0000000-ffffffff"], 
    "[email protected]" => ["00000000-1fffffff", "60000000-7fffffff", 
    "c0000000-dfffffff"], 
    "[email protected]" => ["60000000-7fffffff", "c0000000-dfffffff"], 
    "[email protected]" => ["40000000-5fffffff", "c0000000-dfffffff"], 
    "[email protected]" => ["40000000-5fffffff", "a0000000-bfffffff"]} 

mappées à la nouvelle structure, en utilisant cette méthode dans le contrôleur:

defp map_shards(nodes, :nodes), do: %{"nodes": Enum.map(nodes, fn{k, v} -> %{"node": k, "shards": v} end)}  

Appel à l'intérieur action index:

nodes = map_shards(resp["by_node"], :nodes) 

Maintenant, j'ai carte comme cela :

%{nodes: [%{node: "[email protected]", shards: ["40000000-5fffffff", "a0000000-bfffffff"]}, %{node: "[email protected]", shards: ["20000000-3fffffff", "a0000000-bfffffff"]}, %{node: "[email protected]", shards: ["20000000-3fffffff", "80000000-9fffffff"]}, %{node: "[email protected]", shards: ["20000000-3fffffff", "80000000-9fffffff", "e0000000-ffffffff"]}, %{node: "[email protected]", shards: ["00000000-1fffffff", "80000000-9fffffff", "e0000000-ffffffff"]}, %{node: "[email protected]", shards: ["00000000-1fffffff", "60000000-7fffffff", "e0000000-ffffffff"]}, %{node: "[email protected]", shards: ["00000000-1fffffff", "60000000-7fffffff", "c0000000-dfffffff"]}, %{node: "[email protected]", shards: ["60000000-7fffffff", "c0000000-dfffffff"]}, %{node: "[email protected]", shards: ["40000000-5fffffff", "c0000000-dfffffff"]}, %{node: "[email protected]", shards: ["40000000-5fffffff", "a0000000-bfffffff"]}]} 

Code JS, avec appel analyseur à l'intérieur modèle .eex:

var theData = ("<%= Poison.Encoder.encode(@nodes, []) %>"); 
theData = JSON.parse(theData); 

Ce que je vois dans la console JS:

var theData = ("{&quot;nodes&quot;:[{&quot;shards&quot;:[&quot;40000000-5fffffff&quot;,&quot;a0000000-bfffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;20000000-3fffffff&quot;,&quot;a0000000-bfffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;20000000-3fffffff&quot;,&quot;80000000-9fffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;20000000-3fffffff&quot;,&quot;80000000-9fffffff&quot;,&quot;e0000000-ffffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;00000000-1fffffff&quot;,&quot;80000000-9fffffff&quot;,&quot;e0000000-ffffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;00000000-1fffffff&quot;,&quot;60000000-7fffffff&quot;,&quot;e0000000-ffffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;00000000-1fffffff&quot;,&quot;60000000-7fffffff&quot;,&quot;c0000000-dfffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;60000000-7fffffff&quot;,&quot;c0000000-dfffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;40000000-5fffffff&quot;,&quot;c0000000-dfffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;},{&quot;shards&quot;:[&quot;40000000-5fffffff&quot;,&quot;a0000000-bfffffff&quot;],&quot;node&quot;:&quot;[email protected]&quot;}]}"); 

theData = JSON.parse (theData);

Répondre

1

Vous devez désactiver l'échappement HTML automatique lors de l'injection de JSON codé comme cela. Vous n'avez pas besoin non plus des " environnants ou des crochets.

var theData = <%= raw Poison.Encoder.encode(@nodes, []) %>; 

Il n'y a pas besoin d'appeler JSON.parse plus, theData sera réglé sur la valeur elle-même, pas une chaîne contenant un JSON.

+0

Merci! Oui, maintenant je vois. J'ai essayé sans JSON.parse. –