Nodejs:如何在与其他JSON合并时保留"\u00a0"在JSON字符串中

3

我需要合并两个JSON文件,并且需要保留其中一个文件中的字符串:

"weeks": "weeks\u00a0days"

在合并后,\u00a0总是会变成空格:"weeks": "weeks days"

我希望它仍然保持为:"weeks": "weeks\u00a0days"

一些代码:

//merge.js
const fs = require('fs');
const test1 = fs.readFileSync('./test1.json', 'utf8');
const test2 = fs.readFileSync('./test2.json', 'utf8');

const merge = (obj1, obj2) =>
  JSON.stringify({ ...JSON.parse(obj1), ...JSON.parse(obj2) }, null, 4);

const saveFile = (fileName, obj1, obj2) => {
  fs.writeFile(`${__dirname}/${fileName}`, merge(obj1, obj2), err => {
    if (err) throw err;
    console.log(`The file ${fileName} has been saved!`);
  });
};

saveFile('testFinal.json', test1, test2);

test1.json

{
  "link": {
    "about": "About",
    "version": "version"
  },
  "items": {
    "siteId": "Site ID",
    "siteName": "Site name",
    "siteType": "Site type",
    "weeks": "weeks\u00a0days"
  }
}

test2.json

{
  "features": {
    "activateFeatures": "Activate features",
    "confirmation": "Confirmation",
    "hardware": "Hardware",
    "existingHardware": "Existing hardware",
    "emailLicense": "Email license",
    "downloadLicense": "Select quantity"
  }
}

please help


1
为什么不直接调用 const abc = require('./abc.json') 而不使用 readFileSync() 呢?这样可以避免 JSON.parse() 的调用以及由额外解析所引起的一切麻烦。 - William Chong
@WilliamChong - 不要在上面进行“额外”的解析。 - T.J. Crowder
你的问题不是特别在于 merge,而是 JSON.stringify 中的一个普遍缺陷,请参见 https://dev59.com/F1wZ5IYBdhLWcg3wROiO,https://dev59.com/N2ct5IYBdhLWcg3wL6ui#27252001。 - georg
1
@georg - 没有理由膨胀结果字符串并不是一个缺陷。 - T.J. Crowder
@T.J.Crowder:嗯,他们确实有一个“缩进”选项,甚至更不重要。当你要通过网络发送JSON并且不能确定每个中间人都正确处理UTF8时,“ensure_ascii”是至关重要的。 - georg
显示剩余3条评论
2个回答

2
在合并后,\u00a0 总是会变成空格:"weeks": "weeks days"。
我认为你会发现它转换成了一个硬空格,而不是空格。例如:

const json = '{"foo": "Testing one\\u00a0two\\u00a0three"}';
console.log(json);
const parsed = JSON.parse(json);
console.log(parsed.foo.includes("\u00a0")); // true
const json2 = JSON.stringify(parsed);
console.log(json2);
console.log(json2.includes("\u00a0")); // true

这是完全有效的JSON,与\u00a0 完全相同。如果您的JSON序列化器不会将硬空格写为Unicode转义符,并且您确实需要这样做,那么您需要对字符串进行后处理,例如:

const result = JSON.stringify(stuff).replace(/\u00a0/g, "\\u00a0");

1
默认情况下,JSON.stringify 会保留字符串中的原始字符,并仅对需要转义的元素(如双引号或反斜杠)执行转换,以确保序列化实体的正确语法。
如果您想在目标字符串中转义自定义范围的 Unicode 字符,请使用以下转换构造。当然,您可以调整正则表达式中应编码为 \uXXXX 的 Unicode 字符范围。请参见此处的字符类别:http://www.unicode.org/notes/tn36/Categories.txt
const jsonUtfStringify = inputObject => JSON.stringify(inputObject).replace(
  /[\0-\x1F\x7F-\x9F\xAD\u0378-\uFFFF]/g,
  match => `\\u${(+match.codePointAt(0)).toString(16).padStart(4, '0')}`
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接