首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Javascript解析混合JSON对象

用Javascript解析混合JSON对象
EN

Stack Overflow用户
提问于 2019-09-05 13:32:18
回答 3查看 212关注 0票数 0

我有一个JSON对象,我试图用Javascript来解析它,但是它有点混乱,我不知道实现我所追求的目标的最佳方法。JSON对象如下:

代码语言:javascript
复制
{[null, "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"help"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"help"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…uses"},{"name":"condition","value":"depression"}]", "[{"name":"type","value":"mental health"},{"name":"…uses"},{"name":"condition","value":"depression"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…ypes"},{"name":"condition","value":"depression"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…ypes"},{"name":"condition","value":"depression"}]", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]}

我想要得到的最终结果是值的计数。但是,我也希望将包含在对象中的每个数组中的所有值分开。

到目前为止,我所能达到的最好的结果是:

代码语言:javascript
复制
{
[{"name":"type","value":"mental health"},{"name":"question","value":"prevalence"},{"name":"condition","value":"depression"}]: 2,
[{"name":"type","value":"mental health"},{"name":"question","value":"related issues"},{"name":"condition","value":"depression"}]: 3,
[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]: 7,
[{"name":"type","value":"mental health"},{"name":"question","value":"what is"},{"name":"condition","value":"anxiety"}]: 3,
[{"name":"type","value":"mental health"},{"name":"question","value":"what is"},{"name":"condition","value":"ocd"}]: 2,
[{"name":"type","value":"mental health"},{"name":"question","value":"what is"},{"name":"condition","value":"panic disorder"}]: 6,
[{"name":"type","value":"mental health"},{"name":"question","value":"what is"},{"name":"condition","value":"schizophrenia"}]: 1,
[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]: 8,
null: 19
}

然而,我想要了解的最终结果如下:

代码语言:javascript
复制
{
"type": 32,
"mental health": 32,
"question": 32,
"condition": 17,
"prevalence": 2,
"related issues": 3,
"types": 7,
"what is": 20,
"depression": 5,
"anxiety": 3,
"OCD": 2,
"Panic Disorder": 6,
"Scizophrenia": 1,
null: 19
}

本质上,我希望计数键/值对中的所有值,但我不确定如何做到这一点,因为对象的结构和空值都是与对象的其他值不同的格式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-05 13:56:14

我冒昧地将您的源数据转换为有效的JS:

代码语言:javascript
复制
const src = [null, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`,`[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]`, `[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`,`[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"help"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`,`[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"help"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`,`[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]`, `[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]`, `[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`,`[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]`, `[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]`, `[{"name":"type","value":"mental health"},{"name":"…uses"},{"name":"condition","value":"depression"}]`, `[{"name":"type","value":"mental health"},{"name":"…uses"},{"name":"condition","value":"depression"}]`, `[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]`, `[{"name":"type","value":"mental health"},{"name":"…ypes"},{"name":"condition","value":"depression"}]`, `[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]`, `[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]`, `[{"name":"type","value":"mental health"},{"name":"…ypes"},{"name":"condition","value":"depression"}]`, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null];

下面是一个非常通用(处理嵌套结构)的解决方案:

代码语言:javascript
复制
// map and parse JSON when applicable
const parsed = src.map( item => {
    if ( typeof item === "string" ) {
        try {
            return JSON.parse(item);
        } catch (err) {
            return item;
        }
    } else {
        return item;
    }
});

function isPlainObj ( obj ) {
    return typeof obj == "object" && obj.constructor == Object;
}

function walk ( value, acc ) {
    if ( Array.isArray(value) ) {
        value.forEach( value => walk(value, acc));
    } else if ( value && isPlainObj(value) ) {
        Object.values(value).forEach( value => {
            walk(value, acc );
        });
    } else {
        acc[value] = (acc[value] || 0) + 1;
    }

    return acc;
}

const out = parsed.reduce((acc, value) => {
    return walk(value, acc);
}, {});

console.log(out);

给出

代码语言:javascript
复制
{
  null: 18,
  type: 39,
  'mental health': 37,
  question: 25,
  'what is': 15,
  types: 10,
  '...what is': 4,
  condition: 12,
  phobias: 4,
  help: 2,
  '...s': 4,
  schizophrenia: 4,
  '...uses': 2,
  depression: 4,
  '...ypes': 2
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-05 13:53:43

似乎你想要values计数。没有适当的紧张,如果是这样,那么你可以这样做。

代码语言:javascript
复制
const newObj = {};

obj.array.map((r) => {
   if (!r) {
       (newObj['null']) ? newObj['null'] += 1 : newObj['null'] = 1;
   } else {
       const subArray = JSON.parse(r);
       if (Array.isArray(subArray)) {
           subArray.forEach((r) => {
               Object.values(r)
                   .forEach((v) => {
                       (newObj[v]) ? newObj[v] += 1 : newObj[v] = 1;
                   })
           })
       }
   }
});

console.log(newObj);
票数 0
EN

Stack Overflow用户

发布于 2019-09-05 14:07:49

理想情况下,您希望在源中更改JSON,使其有效。如果失败,这里有一种方法可以从字符串中删除坏字符并对其进行解析。然后,它使用reduce生成一个对象,并对每个可用的对象值进行适当的计数。

代码语言:javascript
复制
const str = '{[null, "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"help"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"help"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"…what is"},{"name":"condition","value":"phobias"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"what is"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"question","value":"types"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…uses"},{"name":"condition","value":"depression"}]", "[{"name":"type","value":"mental health"},{"name":"…uses"},{"name":"condition","value":"depression"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…ypes"},{"name":"condition","value":"depression"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…s"},{"name":"condition","value":"schizophrenia"}]", "[{"name":"type","value":"mental health"},{"name":"…ypes"},{"name":"condition","value":"depression"}]", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]}';

// Replace the failing quotes
const newstr = str.replace(/"\[|\]"/g, '');

// Remove the first and last characters to make the JSON parse, and parse it
const parsed = JSON.parse(newstr.substr(1, newstr.length - 2));

// `reduce` over the array
const result = parsed.reduce((acc, c) => {

  // If the current element isn't null and has a value property
  // extract the value and update the initial object
  if (c && c.value) {
    const { value } = c;
    acc[value] = (acc[value] || 0) + 1;
  }

  // Return the accumulator for the next iteration
  return acc;
}, {}); // <= initial object

console.log(result);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57806672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档