【问题标题】:Nodejs: How to preserve "\u00a0" in JSON string during a merge with other JSON [duplicate]Nodejs:如何在与其他 JSON 合并期间在 JSON 字符串中保留“\u00a0”[重复]
【发布时间】:2019-09-04 07:56:31
【问题描述】:

我必须合并 2 个 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"
  }
}

请帮忙

【问题讨论】:

  • 为什么不直接调用const abc = require('./abc.json') 而不是使用readFileSync()?它可以为您节省JSON.parse() 调用以及额外解析带来的所有麻烦
  • @WilliamChong - 上面没有“额外”解析。
  • 您的问题不在于merge,而是JSON.stringify 的一般缺陷,请参阅stackoverflow.com/questions/31649362/…,stackoverflow.com/questions/12271547/…
  • @georg - 不要无缘无故地膨胀结果字符串并不是一个缺陷。
  • @T.J.Crowder:他们本可以为此添加一个选项,参见。蟒蛇json.dump

标签: javascript json


【解决方案1】:

合并后的 \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");

【讨论】:

    【解决方案2】:

    默认情况下,JSON.stringify 保留字符串中的原始字符,并仅对应转义的元素(如双引号或反斜杠)执行转换,以确保字符串化实体的语法正确。

    如果您想在目标字符串中转义自定义范围的 Unicode 字符,请使用以下转换构造。当然,你可以在正则表达式中调整Unicode字符范围,编码为\uXXXX。在此处查看字符类别: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')}`
    )
    

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 2015-09-14
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2018-06-15
      • 2016-02-17
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多