#javascript #json #mongodb #object #parsing
#javascript #json #mongodb #объект #синтаксический анализ
Вопрос:
Я искал ответ на этот конкретный формат, но не смог найти ни одного для решения этой конкретной проблемы.
Ситуация такова, что у меня есть формат JSON, с которым я не могу работать в сочетании с MongoDB. Я хочу изменить формат данных JSON на обычный объект JavaScript. Теперь данные имеют длину более 2000 записей, поэтому я не могу обработать их вручную. И я не смог заставить JSON.parse (data) работать для такого специального формата.
Вот пример текущего формата JSON:
{
"一": {
"strokes": 1,
"grade": 1,
"freq": 2,
"jlpt_old": 4,
"jlpt_new": 5,
"meanings": ["One","One Radical (no.1)"],
"readings_on": ["いち","いつ"],
"readings_kun": ["ひと-","ひと.つ"],
"wk_level": 1,
"wk_meanings": ["One"],
"wk_readings_on": ["いち","いつ"],
"wk_readings_kun": ["!ひと"],
"wk_radicals": ["Ground"]
},
"二": {
"strokes": 2,
"grade": 1,
"freq": 9,
"jlpt_old": 4,
"jlpt_new": 5,
"meanings": ["Two","Two Radical (no. 7)"],
"readings_on": ["に","じ"],
"readings_kun": ["ふた","ふた.つ","ふたたび"],
"wk_level": 1,
"wk_meanings": ["Two"],
"wk_readings_on": ["に"],
"wk_readings_kun": ["!ふた"],
"wk_radicals": ["Two"]
},
}
И формат, которого я в конечном итоге хочу достичь, следующий:
[
{
kanji: "一",
strokes: 1,
grade: 1,
freq: 2,
jlpt_old: 4,
jlpt_new: 5,
meanings: ["One","One Radical (no.1)"],
readings_on: ["いち","いつ"],
readings_kun: ["ひと-","ひと.つ"],
wk_level: 1,
wk_meanings: ["One"],
wk_readings_on: ["いち","いつ"],
wk_readings_kun: ["!ひと"],
wk_radicals: ["Ground"]
},
{
kanji: "二",
strokes: 2,
grade: 1,
freq: 9,
jlpt_old: 4,
jlpt_new: 5,
meanings: ["Two","Two Radical (no. 7)"],
readings_on: ["に","じ"],
readings_kun: ["ふた","ふた.つ","ふたたび"],
wk_level: 1,
wk_meanings: ["Two"],
wk_readings_on: ["に"],
wk_readings_kun: ["!ふた"],
wk_radicals: ["Two"]
}
]
Как вы можете видеть, исходный формат содержит ключ, описывающий каждый объект, но требуемый формат содержит всю информацию внутри объекта.
Было бы здорово, если бы кто-нибудь мог мне помочь в этой проблеме! 🙂
Ответ №1:
Оба на самом деле являются допустимыми объектами JSON, хотя вы ищете простую манипуляцию:
const data = {
"一": {
"strokes": 1,
"grade": 1,
"freq": 2,
"jlpt_old": 4,
"jlpt_new": 5,
"meanings": ["One","One Radical (no.1)"],
"readings_on": ["いち","いつ"],
"readings_kun": ["ひと-","ひと.つ"],
"wk_level": 1,
"wk_meanings": ["One"],
"wk_readings_on": ["いち","いつ"],
"wk_readings_kun": ["!ひと"],
"wk_radicals": ["Ground"]
},
"二": {
"strokes": 2,
"grade": 1,
"freq": 9,
"jlpt_old": 4,
"jlpt_new": 5,
"meanings": ["Two","Two Radical (no. 7)"],
"readings_on": ["に","じ"],
"readings_kun": ["ふた","ふた.つ","ふたたび"],
"wk_level": 1,
"wk_meanings": ["Two"],
"wk_readings_on": ["に"],
"wk_readings_kun": ["!ふた"],
"wk_radicals": ["Two"]
}
};
const parsed = Object.entries(data).reduce((acc, [kanji, obj]) => acc.concat({kanji, ...obj}), []);
console.log(parsed)
Комментарии:
1. Большое спасибо, Моркадош! Это действительно очень помогло! 🙂
Ответ №2:
map()
Все, что вам нужно, — это один вызов для Object.entries()
проанализированного JSON.
const json = '{"一":{"strokes":1,"grade":1,"freq":2,"jlpt_old":4,"jlpt_new":5,"meanings":["One","One Radical (no.1)"],"readings_on":["いち","いつ"],"readings_kun":["ひと-","ひと.つ"],"wk_level":1,"wk_meanings":["One"],"wk_readings_on":["いち","いつ"],"wk_readings_kun":["!ひと"],"wk_radicals":["Ground"]},"二":{"strokes":2,"grade":1,"freq":9,"jlpt_old":4,"jlpt_new":5,"meanings":["Two","Two Radical (no. 7)"],"readings_on":["に","じ"],"readings_kun":["ふた","ふた.つ","ふたたび"],"wk_level":1,"wk_meanings":["Two"],"wk_readings_on":["に"],"wk_readings_kun":["!ふた"],"wk_radicals":["Two"]}}';
const obj = JSON.parse(json);
const refactored = Object.entries(obj).map(([k, v]) => ({kanji: k, ...v}));
console.log(refactored);
Комментарии:
1. Спасибо, Пилчард, за это компактное решение! Действительно, очень приятно знать! 🙂
2. Не беспокойтесь. Поскольку вы возвращаете массив той же длины, что и исходный массив, лучше использовать
map()
thanreduce()
.
Ответ №3:
Это хорошо для вас?
let json = {
"一": {
"strokes": 1,
"grade": 1,
"freq": 2,
"jlpt_old": 4,
"jlpt_new": 5,
"meanings": ["One","One Radical (no.1)"],
"readings_on": ["いち","いつ"],
"readings_kun": ["ひと-","ひと.つ"],
"wk_level": 1,
"wk_meanings": ["One"],
"wk_readings_on": ["いち","いつ"],
"wk_readings_kun": ["!ひと"],
"wk_radicals": ["Ground"]
},
"二": {
"strokes": 2,
"grade": 1,
"freq": 9,
"jlpt_old": 4,
"jlpt_new": 5,
"meanings": ["Two","Two Radical (no. 7)"],
"readings_on": ["に","じ"],
"readings_kun": ["ふた","ふた.つ","ふたたび"],
"wk_level": 1,
"wk_meanings": ["Two"],
"wk_readings_on": ["に"],
"wk_readings_kun": ["!ふた"],
"wk_radicals": ["Two"]
},
}
let response = [];
for(let key in json){
response.push({ kanji: key, ...json[key]});
}
console.log(response);
Комментарии:
1. Спасибо, Ран Марчиано, решение очень простое для понимания. Была большая помощь! 🙂