如何获取字符串文字并将其保存回原始JSON?

时间:2019-08-21 18:46:24

标签: javascript json string vue.js

我希望能够通过将值和文本输入元素>“ JSON.stringify(txt, null, 2)”的“值”放在该部分中来编辑对象值。

提交输入后,我在所有引号后都留下了包含“ / n”和“ \”的字符串文字。我已经尝试过使用regex和string.replace()来删除它们,但没有任何效果,我的输出始终是这样的:

 "publisher": "[{\"name\":[\"scripps re\"],\"url\":[\"url.com\"]}]",

我也尝试过JSON.parse(txt),它记录得很好,但结果仍然包含换行符和反斜杠。

问题:

是否有一种方法可以从输入元素中获取经过编辑的文本,然后将其转换回没有字符串文字标记的有效JSON?

我正在使用:

VueJS JS

我试图像这样绑定输入字段的值:

 inputVal = JSON.stringify(object[keyname])

效果很好。

问题:

分配新编辑的txt:

 Vue.set(object, keyname, newValue)

newValue始终具有/n\

我尝试过:

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"
}

例如,如何使用文本区域输入来编辑'license'的值并保存回有效的JSON?

预期结果应为(是否经过美化,没有换行符):

{
  "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"
}

3 个答案:

答案 0 :(得分:1)

正则表达式需要更正-

Vue.set(object,keyname,newValue.replace('/ng',""))

s = "[{\"name\":[\"scripps re\"],\"url\":[\"url.com\"]}]".replace('/ng', "");
console.log(s);

您也可以使用unescape()

console.log(unescape( "[\n {\n \"identifier\": [\n \"IDEN\"\n ],\n \"institute\": [\n \"fds\"\n ],\n \"agency\": [\n \"fds\"\n ]\n }\n]" ));

但是,最新的(2019年8月)MDN文档更推荐docodeURIdecodeURIComponent胜过unescape

答案 1 :(得分:0)

您可以使用正则表达式中的/s字符类替换所有空白字符

例如像这样的$('textarea').value.replace(/\s/g, '')

答案 2 :(得分:0)

发现了问题!

因此,我正在检查以查看newdata的类型,以避免在字符串上使用JSON.parse并得到错误。问题是结果始终是一个字符串,因此这里的所有答案都可以使用。我将其更改为检查字符串的第一个索引以检查对象或数组。现在,它可以很好地工作,因为事情得到了适当的处理。

谢谢大家的答复,从技术上来说,您的所有答案都应该奏效,但问题是从未触发过部分编码。

  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)
                      }