用 JSON 字符串中的 hex 替换所有 r、g、b 值 [重复]

Posted

技术标签:

【中文标题】用 JSON 字符串中的 hex 替换所有 r、g、b 值 [重复]【英文标题】:Replace all `r, g, b` values with `hex` in JSON string [duplicate] 【发布时间】:2020-05-20 20:27:45 【问题描述】:
const jsonString = JSON.stringify(myJson, null, 2);

 
      "object1": 
        "subobject1": 
          "r": 0,
          "g": 0,
          "b": 0
        ,
        "someOtherProperty": 1
      ,
      "allColors": 
        "object2": [
          
            "subobject2": 
              "r": 4,
              "g": 5,
              "b": 6
            ,
            "subobject3": 
              "r": 7,
              "g": 8,
              "b": 9
            ,
            "subobject4": 
              "r": 9,
              "g": 10,
              "b": 11
            
          
    ......
    ......
    

在 JS 中用十六进制替换同一字符串对象中的所有 rgb 值的正确正则表达式和方法是什么?例如:

   "subobject2": 
      "r": 4,
      "g": 5,
      "b": 6
    

会变成:

"subobject2": "#040506"

【问题讨论】:

不要对字符串这样做。将 JSON 解析为对象,然后替换属性。 【参考方案1】:
var rgb = 
  "red": 32,
  "green": 38,
  "blue": 46


function tohex(color) 
  function tohex2(dec) 
    hex = Math.max(0, Math.min(255, dec)).toString(16);
    if (hex.length == 1) hex = "0" + hex;
    return hex;
  
  return "#" + tohex2(color["red"]) + tohex2(color["green"]) + tohex2(color["blue"]);


rgb = tohex(rgb);

// rgb = #20262e

【讨论】:

【参考方案2】:

这不是一个很好的解决方案,但它使用正则表达式来替换 rgb 值。

/(\n*\s*"r": \w+,\n*\s*"g": \w+,\n*\s*"b": \w+\n*\s*)/gi

如果你不熟悉正则表达式,这里有一个解释:https://regex101.com/r/F8hQap/1

获得 rgb 值后,您可以将它们解析出来并替换为 hex 值。我在这篇文章中使用了解决方案:https://***.com/a/5624139/2958996

var jsonString = '\n' +
    '      "object1": \n' +
    '        "subobject1": \n' +
    '          "r": 0,\n' +
    '          "g": 0,\n' +
    '          "b": 0\n' +
    '        ,\n' +
    '        "someOtherProperty": 1\n' +
    '      ,\n' +
    '      "allColors": \n' +
    '        "object2": [\n' +
    '          \n' +
    '            "subobject2": \n' +
    '              "r": 4,\n' +
    '              "g": 5,\n' +
    '              "b": 6\n' +
    '            ,\n' +
    '            "subobject3": \n' +
    '              "r": 7,\n' +
    '              "g": 8,\n' +
    '              "b": 9\n' +
    '            ,\n' +
    '            "subobject4": \n' +
    '              "r": 9,\n' +
    '              "g": 10,\n' +
    '              "b": 11\n' +
    '            \n' +
    '          \n' +
    '    \n' +
    '    \n' +
    ''
function componentToHex(c) 
  var hex = c.toString(16);
  return hex.length == 1 ? "0" + hex : hex;


function rgbToHex(r, g, b) 
  return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);


function replacer(string) 
  rgbValues = JSON.parse(string);
  console.log(rgbValues);
  return '"' + rgbToHex(rgbValues['r'], rgbValues['g'], rgbValues['b']) + '"';

var newString = jsonString.replace(/(\n*\s*"r": \w+,\n*\s*"g": \w+,\n*\s*"b": \w+\n*\s*)/gi, replacer);
console.log(newString);

【讨论】:

以上是关于用 JSON 字符串中的 hex 替换所有 r、g、b 值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用C#语言将json格式数据转成json对象

从json字符串中的键字符串替换或删除Dote(。)以插入mongodb

正则表达式笔记——用正则表达式处理文本

替换长json字符串中的新行符号[关闭]

intellij idea有没有像eclipse的全局替换文本,因为我替换所有类中的某一个名称的代码

在ISO文件上使用时,Perl hex替换(s /// g)无效