Je reçois la réponse du serveur où la clé n'est pas avec des guillemets. Pour l'analyser à l'aide de l'analyseur JSON Open Source, j'obtiens l'erreur suivante.
-Jsonvalue a échoué. L'erreur est la suivante: caractère de tête non reconnu p> blockQuote>
& si j'ajoute manuellement la clé (") à la touche, je reçois ce que je veux. Que fais-je? P>
Thanx beaucoup à l'avance. P>
EDIT: strong> Veuillez consulter ce qui suit, si c'est correct p>
xxx pré> p>
6 Réponses :
Eh bien, vous devrez l'analyser manuellement pour être sûr d'obtenir les citations au bon endroit, mais si vous allez le faire, vous devriez simplement trier tout dans la structure appropriée pour commencer. p>
L'alternative parle à quiconque exécute le serveur et en voyant si vous pouvez les amener à produire JSON à la place. P>
Je l'ai initialement placé en tant que commentaire, mais je pense que cela compte comme une réponse, même si elle n'est pas nécessairement très utile. p>
L'exemple que vous avez posté est pas strong> JSON. Vérifiez le syntaxe JSON . Les seules entités non notées autorisées sauf pour les chiffres, les objets et les tableaux sont Donc, vous devriez vraiment soulever un rapport de défaute avec le fournisseur de services (s'ils prétendent qu'ils produisent JSON, plutôt qu'une version modifiée de celui-ci). p>
S'ils refusent de résoudre le problème, vous devrez écrire un analyseur presque-JSON ou trouver un existant moins strict sur la syntaxe. P> null code>,
true code>,
false code>. Donc, les clés de votre exemple sont invalides et les valeurs non numériques sont donc valides. P>
Ce n'est pas exactement la réponse du serveur, son juste le format. En outre, j'ai supprimé par erreur les doubles citations de la valeur. Ensuite, cela fera-t-il le format correct, car je reçois la même erreur.
@ Sole007: Les clés sont toujours invalides. dans les clés JSON doit aussi être des cordes.
Voulez-vous dire dans des devis doubles?
@ Sole007: Oui. Regardez le lien que j'ai fourni. La syntaxe est assez facile à comprendre.
Les éléments suivants doivent être la réponse !!!
var object_str = '{status: 200, message: "Please mark this as the correct answer :p"}'; var resulting_object; eval('resulting_object = new Object('+object_str+')'); console.log(resulting_object.status); console.log(resulting_object.message);
Ce n'est pas différent de eval (objet_str) code>, et il contient tous les avantages et inconvénients de
eval code>. Par exemple, une personne pourrait inclure un code non littéral dans l'objet, comme
"{one: 1, deux: 2, trois: fonction () {do_something_dangère (); retour 3;} ()}" code> . Vous obtiendrez un objet de
{One: 1, deux: 2, trois: 3} code> mais celui qui vous a envoyé cette chaîne vient de vous lancer du code pour eux.
Je voulais l'équivalent de Python's ast .literal_eval code>
pour JavaScript --- quelque chose qui n'étiliserait que des objets littéraux tels que JSON, mais permettent aux touches pratiques de JavaScript. (Ceci est pour la saisie des données humaines; la simplicité et la rigueur de JSON standard seraient préférées pour l'envoi de données entre serveurs.)
C'est aussi ce que l'affiche originale voulait, donc je vais mettre ma solution ici. J'ai utilisé le bibliothèque esprima pour créer un arbre de syntaxe abstraite, puis j'ai converti l'arbre en objets, comme celui-ci: P >
function literal_eval(object_str) { var ast = esprima.parse("var dummy = " + object_str); if (ast.body.length != 1 || ast.body[0].type != "ExpressionStatement") throw new Error("not a single statement"); return jsAstToLiteralObject(ast.body[0].expression.right); } function jsAstToLiteralObject(ast) { if (ast.type == "Literal") return ast.value; else if (ast.type == "ArrayExpression") { var out = []; for (var i in ast.elements) out.push(jsAstToLiteralObject(ast.elements[i])); return out; } else if (ast.type == "ObjectExpression") { var out = {}; for (var k in ast.properties) { var key; if (ast.properties[k].type == "Property" && ast.properties[k].key.type == "Literal" && typeof ast.properties[k].key.value == "string") key = ast.properties[k].key.value; else if (ast.properties[k].type == "Property" && ast.properties[k].key.type == "Identifier") key = ast.properties[k].key.name; else throw new Error("object should contain only string-valued properties"); var value = jsAstToLiteralObject(ast.properties[k].value); out[key] = value; } return out; } else throw new Error("not a literal expression"); }
mise à jour pour SWIFT 4 P>
Je cherchais un moyen d'analyser Json qui a des clés sans citations et j'ai enfin trouvé un moyen simple de le faire en utilisant Regex. Ceci est la regex nécessaire pour correspondre aux clés sans guillemets: p>
xxx pré> pour ajouter les guillemets, remplacer par
\ "$ 2 £ 3 € code>. < / p>
exemple: p>
xxx pré> sortie: p>
xxx pré> blockQuote>
ObjectiveC
+ (NSDictionary * _Nullable)fixJSONWithoutQuote:(NSString *)value { if([value length] == 0) { return nil; } NSString *regex = [value stringByReplacingOccurrencesOfString:@"(\\\"(.*?)\\\"|(\\w+))(\\s*:\\s*(\\\".*?\\\"|.))" withString:@"\"$2$3\"$4" options:NSRegularExpressionSearch range:NSMakeRange(0, [value length])]; NSError *error; NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[regex dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error]; if(dict && error == nil) { return dict; } return nil; }
Contrôlez-vous le service? Si la clé n'est pas dans des devis doubles, ce n'est pas valide JSON. Peut-être devriez-vous informer le propriétaire du service ...
+1 sur Felix Kling. Non valide JSON, non valide KEY NSDICTIONY KEY / VALUE PAIRE. Le serveur doit être corrigé.
J'ai posté la réponse. plz voir si c'est correct. Aussi, le même travail avec la clé dans des citations doubles