从对象中的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