Json.stringify конкретные поля, где одно из полей является объектом
ВОПРОС
Я хочу вызвать JSON.stringify, передав поля, которые я хочу включить в строку. Одним из полей, которые я хочу включить, является объект. Метод JSON.stringify не включает в себя ни одно из полей объекта, как я бы ожидал.
Вот небольшое подмножество моего большего объекта;
var person = {
name: "John Doe",
Address: { Line1: "100 north main", City: "Des Moines" },
Phone: "555-5555"
}
Вот вызов метода stringify
console.log(JSON.stringify(person,["name","Address"]));
Вот результаты
"{\"name\":\"John Doe\",\"Address\":{}}"
Вот js bin, которую я создал - http://jsbin.com/UYOVufa/1/edit?html,console.
Я всегда мог зачеркнуть только человека. Адреса и объединить его с другой строкой, но это кажется излишним.
Что мне не хватает?
Спасибо,
3 ответа
JSON.stringify принимает заменитель (этот массив...) в качестве аргумента. Обратите внимание на документацию по замене:
Если вы возвращаете любой другой объект, объект рекурсивно преобразуется в строку JSON, вызывая функцию замены для каждого свойства, если только объект не является функцией, и в этом случае ничего не добавляется в строку JSON.
(Источник: https://developer.mozilla.org/en-US/docs/Using_native_JSON)
Это будет работать:
JSON.stringify(person,["name","Address", "Line1", "City"])
Как упомянуто выше, JSON.stringfy выполняет рекурсивную замену, и для его получения просто необходимо указать имена ключей. Но и этого достаточно, чтобы легко создавать собственные версии строк json.
Мое предложение достичь желаемого решения
JSON.stringify(person, function(k,v){
if(k!=="Phone"){
return v;
}
});
Функция заменяет заменитель по умолчанию и позволяет вам выводить все, что вы хотите, не затрагивая исходный объект json. Представьте себе возможности, значительно увеличивающие контроль над выходным откликом.
Он проверяет список полей для каждого ключа, даже если это ключ во вложенном объекте:
JSON.stringify(person, ['name', 'Address', 'Line1', 'City'])
=> "{"name":"John Doe","Address":{"Line1":"100 north main","City":"Des Moines"}}"