JSON.stringify: как пропустить отступ для одного (или нескольких) объектов

1

Я хочу отступывать весь объект, за исключением некоторых конкретных под-объектов.

Это самое близкое, что я решил решить. В этом примере я хочу избежать отступов color:

let obj = {
    colorsPerValue: [
        { value: 0.0, color: { r: 240, g: 59, b: 32 } },
        { value: 0.5, color: { r: 255, g: 255, b: 255 } },
        { value: 1.0, color: { r: 44, g: 162, b: 95 } }
    ]
};
let str = JSON.stringify(obj, replacer, 2);
console.log(str);

replacer(name, val) {
    if (name === 'color') {
        return JSON.stringify(val); // stringify with no indentation
    } else {
        return val; // return as is
    }
};

Желаемый результат:

{
    colorsPerValue: [
        { 
            value: 0.0, 
            color: { r: 240, g: 59, b: 32 } 
        },
        { 
            value: 0.5, 
            color: { r: 255, g: 255, b: 255 } 
        },
        { 
            value: 1.0, 
            color: { r: 44, g: 162, b: 95 } 
        }
    ]
}

Фактический результат (вы догадались, return JSON.stringify(val); возвращает сериализованную string которая не то, что я хотел):

{
  "colorsPerValue": [
    {
      "value": 0,
      "color": "{\"r\":240,\"g\":59,\"b\":32}"
    },
    {
      "value": 0.5,
      "color": "{\"r\":255,\"g\":255,\"b\":255}"
    },
    {
      "value": 1,
      "color": "{\"r\":44,\"g\":162,\"b\":95}"
    }
  ]
}

let obj = {
  colorsPerValue: [
    { value: 0.0, color: { r: 240, g: 59, b: 32   } },
    { value: 0.5, color: { r: 255, g: 255, b: 255 } },
    { value: 1.0, color: { r: 44, g: 162, b: 95   } }
  ]
};
let str = JSON.stringify(obj, replacer, 2);
console.log(str);

function replacer(name, val) {
  if (name === 'color') {
    return JSON.stringify(val); // stringify with no indentation
  } else {
    return val; // return as is
  }
};
  • 0
    Вы хотите "красиво напечатать" свой JSON, или что вы пытаетесь сделать?
  • 0
    @MichaelHirschler Да, это так. Некоторые из «нижних объектов» являются «менее интересными» для читателя, и мне нужно оставить их без отступа, потому что в противном случае они «запутывают» другую интересную информацию вокруг него.
Теги:
indentation

1 ответ

1
Лучший ответ

Вы можете удалить все пробелы в фигурных скобках, которые начинаются с "color":

var obj = {
        colorsPerValue: [
            { value: 0.0, color: { r: 240, g: 59, b: 32 } },
            { value: 0.5, color: { r: 255, g: 255, b: 255 } },
            { value: 1.0, color: { r: 44, g: 162, b: 95 } }
        ]
    },
    str = JSON
        .stringify(obj, null, 2)
        .replace(/("color": \{)([^}]+)/g, (_, a, b) => a + b.replace(/\s+/g, ' '));

console.log(str);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню