从对象中的JSON解析对象获取值;动态键(JavaScript)

从对象中的JSON解析对象获取值;动态键(JavaScript),javascript,arrays,json,object,Javascript,Arrays,Json,Object,如果我通过括号表示法指定键,我就能够正确地解析这个有效负载,但是如何动态解析它呢 { "name": "Demo User", "birthday": "January 1st", "hobbies": { "morning": "coding", "afternoon": "kewl kids stuff", "nighttime": "random" }, "date": "June 2

如果我通过括号表示法指定键,我就能够正确地解析这个有效负载,但是如何动态解析它呢

{
    "name": "Demo User",
    "birthday": "January 1st",
    "hobbies": 
        {
        "morning": "coding",
        "afternoon": "kewl kids stuff",
        "nighttime": "random"
    },
    "date": "June 25th"
}
我的意思是业余爱好可能不存在,或者可能存在另一个字段,比如“最喜欢的食物”,可以是数组或对象

这个场景在过去的几个月里给我带来了很多挫折,我想看看是否有人能向我解释如何成功地动态解析它

我发现了一种递归的“walk”方法,这种方法不再出错,但它会返回每次迭代遇到的第一件事情

var data = require("./demo.json");

//data = JSON.stringify(data);

function walk(obj) {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      var val = obj[key];
      console.log(val);
      walk(val);
    }
  }
}

walk(data);
根据我的发现,数据是作为JSON导入的,如果我将其字符串化,它就会变成一个字符串(显然)

默认值

{ name: 'Demo User',
  birthday: 'January 1st',
  hobbies:
   { morning: 'coding',
     afternoon: 'kewl kids stuff',
     nighttime: 'random' },
  date: 'June 25th' }
Stringify

{"name":"Demo User","birthday":"January 1st","hobbies":{"morning":"coding","afternoon":"kewl kids stuff","nighttime":"random"},"date":"June 25th"}
两者都很相似,但输出上唯一的区别是它滥发
D
X次(我认为是第一个值?)或滥发
{
X次(是字符串的第一个值

我尝试了一种更基本的方法

var data = require("./demo.json");

for (var key in data){
    console.log(key + ':' + data[key]);
}
这很好,但正如预期的那样,业余爱好正在返回
[object object]
,因为我没有迭代它。我可以通过
业余爱好
,但我不知道它是否会存在

欢迎提出任何一般性的问题,但在过去几个月里,这个过程让我对不同的项目感到非常沮丧

更新

我的含糊不清理所当然地引起了混乱

假设我的目标是将这个JSON有效负载转换为CSV。我需要标题的每个键,每个值都是所述标题下的一行。 我的问题是,当我迭代它时,我最终得到了正确转换的最高级别的对象,然后我得到了一个没有数据的对象列

对于这个确切的例子,假设我的目标是将JSON转换为

name, birthday, hobbies/morning, hobbies/afternoon, hobbies/nighttime, data
Demo User, January 1st, coding, kewl kids stuff, random, June 25th
更新#2

附加
阵列
变体

我希望

{
...
    "hobbies": 
        {
        "morning": "coding",
        "afternoon": "kewl kids stuff",
        "nighttime": "random"
    },
    ...
}
{
...
    "hobbies": ["coding", "kewl kids stuff", "coding"]
    ...
}
输出
嗜好/上午、嗜好/下午、嗜好/夜间

我希望

{
...
    "hobbies": 
        {
        "morning": "coding",
        "afternoon": "kewl kids stuff",
        "nighttime": "random"
    },
    ...
}
{
...
    "hobbies": ["coding", "kewl kids stuff", "coding"]
    ...
}
输出一列
爱好
随附报价项目
“编码,kewl孩子们的东西,编码”

您可以检查每个值的类型并决定要执行的操作

var data = require("./demo.json");

walk(obj){
    for (var key in data){
        if(type(data[key]) === "string"){
            console.log(key + ':' + data[key]);
        }
        else if(Array.isArray(data[key])){
            //its an array
        }
        else if(type(data[key]) === "object"){
            //its an object
            walk(data[key])       
        }
    }
}
您的
walk
函数向您发送
D
{
垃圾邮件的原因是,当它遇到字符串时,它会进入无限循环

function walk(obj) {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      var val = obj[key];
      console.log(val);
      //here you need to check if it is an array or object, only then you should call walk
      //calling walk on string would send it on a infinite loop
      if(typeof(val) === "object"){
          walk(val);
      }
    }
  }
}

可能您所描述的是一种情况,您期望的对象的一个或多个属性不存在,或者没有内容(或成员,如果是数组),以及如何在此基础上构建代码

它不可能是完全随机的,否则你就不会谈论csv样式的输出。所以我假设你的对象内容大部分都在那里,但偶尔你会发现缺少一些东西

如果是我,我会在使用JSON.parse()时预处理加载的对象或者您用来将字符串转换为javascript对象的任何等价物。我会使用类似jquery的东西将一个格式完美的对象合并到我的数据中,其中目标是一个数组属性。这将为我提供一个一致的数据模型来进行编码

总之,您必须按照您希望的方式创建数据,以便能够毫无意外地使用它。

尝试使用此函数(答案末尾的片段)

#控制台{
字体系列:Courier New、Courier、Lucida Sans打字机、Lucida打字机、monospace;
空白:预处理;
}
跨度{
颜色:暗灰色;
}

名称被缩小到一行,以便更容易阅读

如果您希望所有字符都具有相同的宽度,请使用此字体系列。
仍不清楚为什么
JSON.stringify
不够。能否为JSON添加输入和预期输出的简单示例?
var data=require(“./demo.JSON”)
--您已经在
数据中解析了它。
@nickzoum我刚刚添加了输出期望值来帮助解释我的“特定”问题。我可以理解这种混淆。@DNorthrup那么数组应该如何显示?像这样:
嗜好/0,嗜好/1…
?@nickzoum好的问题,我还没有找到数组的提要。但是我会我希望我的输出是一列,带引号(不破坏CSV)。例如:
爱好:[“游戏”、“编码”、“社交”]
输出
爱好
“游戏、编码、社交”
Wow,这比我预期的要多得多。我感谢你的努力!我会将此标记为已接受,并对其进行反向工程以完全理解。我想我已经了解了它的基本概念。@DNorthrup如果有什么你不懂的地方,请告诉我,同时确保你使用了
font
空白
CSS属性
如果要使用
HTML