Je veux pouvoir modifier les valeurs d'objet en mettant la valeur et la "valeur" d'un élément d'entrée de texte> JSON.stringify (txt, null, 2) cette partie fonctionne bien.
Après avoir soumis cette entrée, il me reste une chaîne littérale contenant "/ n" et "\" après tous les guillemets. J'ai essayé regex et string.replace () pour essayer de les supprimer mais rien ne fonctionne, ma sortie est toujours quelque chose comme ceci:
{
"publisher": "[{"name":["scripps re"],"url":["url.com"]}]",
"license": {
"text": "CC BY-NC 4.0",
"url": "http://creativecommons.org/licenses/by-nc/4.0/",
"description": "Attribution-NonCommercial 4.0 International"
}
J'ai aussi essayé JSON.parse (txt) et il se connecte bien mais le résultat contient toujours des sauts de ligne et des barres obliques inverses.
Y a-t-il un moyen de prendre le texte modifié d'un élément d'entrée et de le reconvertir en JSON valide sans marque littérale de chaîne?
J'utilise:
VueJS strong >, JS
J'ai essayé de lier la valeur du champ de saisie comme ceci:
Vue.set(object, keyname, newValue.replace('/n'g,""))
Vue.set(object, keyname, JSON.parse(newValue))
{
"publisher": "[{\"name\":[\"scripps re\"],\"url\":[\"url.com\"]}]",
"license": {
"text": "CC BY-NC 4.0",
"url": "http://creativecommons.org/licenses/by-nc/4.0/",
"description": "Attribution-NonCommercial 4.0 International"
}
qui fonctionne très bien.
Attribution du nouveau txt modifié:
Vue.set(object, keyname, newValue)
newValue a toujours / n code > et \
J'ai essayé:
inputVal = JSON.stringify(object[keyname])
Comment puis-je modifier la valeur de 'license' par exemple, en utilisant une entrée textarea et en sauvegardant un JSON valide?
Le résultat attendu devrait être (joli ou pas, juste pas de marque de saut de ligne):
"publisher": "[{\"name\":[\"scripps re\"],\"url\":[\"url.com\"]}]",
3 Réponses :
Le regex doit être corrigé -
console.log(unescape( "[\n {\n \"identifier\": [\n \"IDEN\"\n ],\n \"institute\": [\n \"fds\"\n ],\n \"agency\": [\n \"fds\"\n ]\n }\n]" ));
s = "[{\"name\":[\"scripps re\"],\"url\":[\"url.com\"]}]".replace('/ng', "");
console.log(s);
Vous pouvez également utiliser unescape()
Vue.set(object,keyname,newValue.replace('/ng',""))
Cependant, docodeURI ou decodeURIComponent est préféré à unescape par la dernière documentation MDN (août 2019) p >
"bailleur de fonds": "[\ n {\ n \" identifiant \ ": [\ n \" IDEN \ "\ n], \ n \" institut \ ": [\ n \" fds \ "\ n], \ n \ "agency \": [\ n \ "fds \" \ n] \ n} \ n] "Cela n'a pas fonctionné pour moi, ajoute simplement plus d'espace après les sauts de ligne.
Je peux voir que cela fonctionne ici, mais pour une raison quelconque, avec le code réel, cela ne fonctionne pas, le résultat est le même. dit également qu'unescape n'est pas exactement obsolète, mais il y a un avertissement à ce sujet. Je vais essayer de cerner davantage le problème, mais merci pour l'aide, idk pourquoi cela ne prend pas, semble être une chose si simple ...
unescape est obsolète. Une petite note aidera les futurs critiques
Vous pouvez remplacer tous les caractères d'espacement en utilisant la classe de caractères / s dans regex
par exemple quelque chose comme ceci $ ('textarea'). value.replace (/ \ s / g, '')
IDK pourquoi toutes les méthodes de remplacement et les regex ne fonctionnent pas, la valeur est toujours la même. Je vais essayer de voir où cela se passe, merci pour l'aide!
essayez ceci pour examiner et tester comment votre regex fonctionnera; regex101.com
Merci!! Je vais utiliser ça
J'ai trouvé le problème!
Je faisais donc une vérification pour voir le type de newdata pour éviter d'utiliser JSON.parse sur une chaîne et obtenir une erreur. Le fait est que le résultat était toujours une chaîne, donc toutes les réponses ici auraient fonctionné. Je l'ai changé pour vérifier le premier index de la chaîne pour vérifier les objets ou les tableaux. Maintenant, cela fonctionne très bien parce que les choses sont gérées de manière appropriée.
Merci à tous ceux qui ont répondu, techniquement, toutes vos réponses auraient dû fonctionner mais le problème était qu'une partie du codé n'était jamais déclenchée.
if (newdata.value[0]==="{" || newdata.value[0]==="[") {
Vue.set(self.meta,keyname.value,JSON.parse(newdata.value) )
}else{
Vue.set(self.meta,keyname.value,newdata.value)
}
quand vous avez fait newValue.replace ('/ n'g, "") n'a-t-il pas supprimé les fins de ligne?
Non, rien ne semble marcher, je ne peux pas y remédier
Quand j'essaie de me débarrasser d'un espacement lié à une chaîne, je dis:
str.replace (/ [\ n \ t \ r] / ig, '');afin de supprimer les retours chariot, onglets, etc.Tout cela devrait fonctionner, mais pour une raison quelconque, rien ne fonctionne et la valeur a toujours / n et \. Peut-être que c'est Vue qui fait ça, IDK ...
Chaque propriété de l'éditeur et de la licence est-elle une entrée de texte ou existe-t-il une entrée de texte pour l'ensemble de la propriété de l'éditeur?
@CathyHa une entrée de texte pour la valeur entière sous forme de chaîne. J'ai trouvé le problème, et j'y ai répondu ci-dessous, le problème était ailleurs. Merci d'avoir jeté un coup d'œil à ce tho!