简体   繁体   English

如何将特殊的 JSON 格式解析为 JavaScript 对象?

[英]How to parse a special JSON format to JavaScript object?

I have been searching for an answer to this specific kind of format, but was not able to find any to solve this specific issue.我一直在寻找这种特定格式的答案,但找不到任何解决此特定问题的方法。

The situation is, I have a kind of JSON format that I can't work with in combination with mongoDB.情况是,我有一种无法与 mongoDB 结合使用的 JSON 格式。 I wish to alter the format of the JSON data to a normal JavaScript object.我希望将 JSON 数据的格式更改为普通的 JavaScript 对象。 Now the data is over 2,000 entries long, so I can't handle it manually.现在数据超过 2,000 个条目,所以我无法手动处理。 And I couldn't make the JSON.parse(data) work for this kind of special format.而且我无法让 JSON.parse(data) 为这种特殊格式工作。

Here an example of the current JSON format:这是当前 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"]
    },
}

And the format I eventually wish to achieve is the following:我最终希望实现的格式如下:

[
    {
        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"]
    }
]

As you can see, the initial format has a key describing each object, but the aspired format has every info inside the object.如您所见,初始格式具有描述每个对象的键,但期望格式具有对象内部的所有信息。

It would be awesome if someone could help me out on this problem!如果有人能帮我解决这个问题,那就太棒了! :) :)

Both are actually valid JSON objects, although you are looking for a simple manipulation:两者实际上都是有效的 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)

Is this good for you?这对你有好处吗?

 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);

A single map() call on the Object.entries() of the parsed JSON is all you need.您只需要对已解析 JSON 的Object.entries()进行一次map()调用。

 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM