JSON упорядочивает объекты со строками json уже в качестве значений

Может быть дублирующий вопрос, но не смог найти ответ. Я хочу преобразовать объект javascript, который содержит некоторые строки JSON в качестве значений.

Например:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

Как видите, значением ключа «options» является строка JSON. Я хочу преобразовать объект «obj» в строку без двойной строки внутренней строки JSON.

Есть ли какое-нибудь чистое и аккуратное решение для этого, кроме разбора каждого значения с помощью строки JSON и строкового определения объекта?


person Jeff    schedule 12.06.2017    source источник
comment
Единственный чистый способ — в первую очередь избегать смешивания объектов JSON и JavaScript.   -  person str    schedule 12.06.2017
comment
Мне очень любопытно, как вы вообще оказались с экранированной строкой JSON в структуре JSON. В идеале obj.options должен быть объектом JSON, а не строкой в ​​данном случае. Если, к сожалению, вы не можете это изменить, но знаете, какие свойства являются JSON, а какие нет, вы можете использовать JSON.parse() для свойства, заменить строковое значение, а затем вызвать JSON.stringify().   -  person KevinLH    schedule 12.06.2017
comment
Знаете ли вы заранее, какие свойства объекта содержат строковый JSON?   -  person PeterMader    schedule 12.06.2017
comment
@KevinLH Я извлекал некоторые данные из устаревшей реляционной базы данных на node.js, которая имеет строки JSON в качестве значений в нескольких столбцах. Я знаю, что могу проанализировать каждую строку JSON, а затем преобразовать весь объект в строку, но мне было любопытно, есть ли для этого какое-либо другое более простое решение.   -  person Jeff    schedule 12.06.2017
comment
Значение не может стать свойством. Таким образом, даже если вы замените все \ , значение параметра будет просто строковым значением. Чтобы значение присутствовало в options как часть основного obj, вы должны обрабатывать его лично (путем разбора его как JSON).   -  person S Jayesh    schedule 12.06.2017


Ответы (4)


Нет, вы не можете этого сделать.
Если вы не закодировали эту строку, JSON.parse не вернет правильную строку.

Самое чистое решение для этого — использовать JSON для obj.options и приводить его в строку, когда вам нужно его использовать.

person Anson Yeung    schedule 12.06.2017

Предполагая, что вы не знаете, какие свойства являются JSON, вы можете использовать параметр функции замены в JSON.stringify, чтобы проверить, является ли значение строкой JSON. Приведенный ниже пример пытается проанализировать каждую строку внутри try..catch , поэтому он не самый эффективный, но должен сработать (также и для вложенных свойств)

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

function checkVal(key,val){
	if(typeof val === 'string'){
		try{return JSON.parse(val);}catch(e){}
  }
  return val;
}

var res = JSON.stringify(obj,checkVal);

console.log('normal output', JSON.stringify(obj))
console.log('with replacer', res);

person Me.Name    schedule 12.06.2017

В этом случае вам нужно сначала разобрать options до JSONObject. Вы можете сделать это, используя следующие два подхода:

Подход 1:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};
obj.options  = JSON.parse(obj.options);
console.log(JSON.stringify(obj));

Подход 2:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

var result = JSON.stringify(obj, function(key, val) {
    if (key === "options"){
            return JSON.parse(val);
        }else{
            return val;
        }
});

console.log(result);

Теперь это будет stringify options только один раз.

person Sachin Gupta    schedule 12.06.2017
comment
в JSON — от не до! - person Quentin; 12.06.2017

Вы могли бы сделать так

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

var options  =JSON.parse(obj.options);

obj.options = options;

console.log(obj);

person Dinesh undefined    schedule 12.06.2017
comment
Я написал в вопросе без разбора - person Jeff; 12.01.2021
comment
Пожалуйста, прочитайте также принятый ответ. Вы не можете парсить без json.parse. - person Dinesh undefined; 13.01.2021