2017-09-16 144 views
-1

我有这样如何解析JSON对象数组

{ 
    "op": "create", 
    "collection": "test", 
    "args": [ 
    { "a": 1 }, 
    { "b": 2 }, 
    { "c": 3 } 
    ] 
} 

我想打印出所有的ARGS元素,然后seperately它们划分JSON对象。这是我为解析json元素所做的,我能够获得“op”或“collection”元素。然而,我并没有失败“args”元素。这是我用代码做的,它给出了什么输出。

var config= JSON.parse(item) // I am getting item from the command line 
console.log ("op is"+ config.op); 
console.log("arg is"+ config.args); 

输出是; op是创建 参数表是[对象对象],[目标对象],[目标对象]

顺便说一句,我还试图用stringfy方法,并没有工作,以及

+1

尝试'console.log(“arg is”,config.args);'改为,或'console.log(“arg is”,JSON.stringify(config.args));' –

+0

config.args是一个对象数组,如果你想要console.log这些,你需要逐个遍历config.args ..*'我也尝试过使用stringfy方法,但它没有工作。* *你做错了,那么 –

+0

或'console.log(“arg is”,[] .concat(... config.args.map(Object.values )))' – trincot

回答

0

你想要的东西喜欢这个?

所以config.args是一个数组,所以我们循环(使用for(var x of config.args){),以获得对象中(例如:{ "a": 1 })数组throught,那么我们单独通过循环虽然键(使用for(var key in x)获得的价值从对象),在我们的例子中只有一个,并获得相应的值x[key],最后将其推送到输出数组output.push(x[key]),然后我们在控制台中显示结果!

var jsonString = `{ 
 
    "op": "create", 
 
    "collection": "test", 
 
    "args": [ 
 
    { "a": 1 }, 
 
    { "b": 2 }, 
 
    { "c": 3 } 
 
    ] 
 
}` 
 
var output = []; 
 
var config= JSON.parse(jsonString); 
 
console.log ("op is"+ config.op); 
 
console.log("keys:") 
 
for(var x of config.args){ 
 
    for(var key in x){ 
 
    console.log(x[key]); 
 
    output.push(x[key]); 
 
    } 
 
} 
 
console.log("Final Array:") 
 
console.log(output);

1

你的输出args is [object Object], [object Object] ,[object Object]仅仅是如何写的console.log命令的神器。您已使用+将字符串"args is"config.args组合,因此config.args正在转换为字符串,并且由于它是一个数组,因此生成的字符串是依次转换为字符串的每个元素的逗号分隔序列,并且转换为字符串的对象变为"[object Object]"

相反,打印这种方式:

const config = { 
 
    "op": "create", 
 
    "collection": "test", 
 
    "args": [ 
 
    { "a": 1 }, 
 
    { "b": 2 }, 
 
    { "c": 3 } 
 
    ] 
 
}; 
 

 
console.log("arg is", config.args);

如何解析JSON对象数组

你深感困惑的含义单词JSON,如何使用(或不使用)术语“JSON对象”,以及“解析”的含义。

“JSON”意味着一件事:a 字符串遵循特定语法,表示一些数据。使用这种字符串表示是因为它可以在计算机系统(如客户端和服务器)之间传递,并以不同语言使用。正如json.org网站所说(我强调):

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。 [...]基于JavaScript的子集 [...]是[...]] JSON是文本格式是完全独立于语言

换句话说,对象文本在JavaScript中,如{a: 1},或它定义了对象,是 JSON,也永远不会是JSON,将它引用为JSON或作为“JSON对象”是不正确的 - 这是一种甚至不存在于世界中的事物,并且不能,因为JSON是一个字符串。一个JavaScript中的对象被称为一件事:一个JavaScript对象,或者如果上下文清楚,只需对象(如果您想知道,它也永远不会被称为“散列”或“字典”或“关联数组”)。这样的JavaScript对象可能是从服务器获取的JSON中获得的,或者它可能注定要最终转换成JSON发送到服务器,甚至可能存储在名为jsonObj的变量中以提醒我们它的起源或它的目的地,但仍然不会让它成为JSON。它是一个JavaScript对象

术语“解析”在计算机科学中具有非常具体的含义。它意味着根据一些语法或语法来分析一些输入,通常是一个字符串,并且将其转换成某种解析表示。维基百科说:

解析是分析一串符合正式语法规则的符号的过程。

JavaScript对象不需要被解析。它已经是一个JavaScript对象的形式。您可以直接访问属性,其基本语法为object.propertyobject["property"]。访问像这样的属性是而不是解析,并且不应该被称为解析。

解析是适用于JSON的东西,当该术语用于正确的意义上,即字符串的意义。我们根据JSON语法规则解析字符串,以创建一个解析后的表示,对于JavaScript,它将是一个JavaScript对象。这是JSON.parse所做的。当然JSON.stringify的方向相反。

在JavaScript编程的正常过程中,您实际上会发现相对较少的情况,您需要担心JSON,解析或字符串化。如果您确实发现自己担心这些事情,那么您可能会误解有关您的数据或工具的内容。大多数用于从服务器检索数据的API会自动将服务器提供的JSON转换为JavaScript对象,为您提供已经解析并可以直接访问的内容。大多数用于将数据传递到服务器的API将自动将您提供的JavaScript对象转换为JSON。在任何情况下,您都不必担心解析或字符串化,除了可能确保在XHR对象上指定某些选项(如responseType: json)之外。如果您将JavaScript对象存储在“本地存储”中,则可能需要担心解析和字符串化,因为本地存储按定义存储字符串。

我想打印出所有args元素[原文如此],然后将它们分开[sic]。这是我做的解析json元素,我能够得到opcollection元素。不过,我并没有得到args元素。

我知道不是每个人都是母语为英语的人,但是很难理解这句话。我想你的意思是“打印出所有元素(复数)args”。我不知道你的意思是“分开分开”。你的意思是一个接一个地处理元素吗?我也不知道你的意思是什么“这是我做的解析json元素”。这是避免错误地使用诸如“parse”和“json”之类的术语的完美例子;你只是迷惑自己和其他人。

如果你所说的是要通过一个在覆盖着每一个基本JS教程和数组元素介绍到打印出args财产之一元素,顺便循环:

const config = { args: [{ "a": 1 }, { "b": 2 }, { "c": 3 }] }; 
 
    
 
for (const elt of config.args) console.log(elt);

for...of形式,如果你不知道的是你一定要学会,遍历数组中的元素。

或者,当然你也可以在指数数组,从0高达config.args.length使用常规for回路循环。

但是,如果您想按属性细分{"a": 1}属性,并且逐个打印每个属性及其值? (当你说“分开分开”时,这可能意味着什么?)在这种情况下,我们需要一种方法来查找所有属性,假设我们不提前知道它们。查找一个对象的属性在任何JS介绍中都会很早涉及到,所以我们并不需要详细介绍这些细节,但是我们来编写一个函数来打印出所有对象的属性及其值:

function printObjectPropertiesAndValues(object) { 
} 

我们可以在代码中使用此之上,如下所示:

for (const elt of config.args) printObjectPropertiesAndValues(elt); 

因为我们只是调用一个函数现在每个元素上,有些人可能更愿意使用map

config.args.map(printObjectPropertiesAndValues); 

你应该确保你明白上面的行和它是如何工作的。

无论如何,我们该怎么写printObjectPropertiesAndValues?有几种方法。其他答案中有一些想法。一种方法是使用for...in语句,该语句循环访问某个对象的属性。

function printObjectPropertiesAndValues(object) { 
    for (const prop in object) console.log("property", prop, "has value", obj[prop]); 
} 

你也应该确保你理解上面的代码做什么,并且特别是什么obj[prop]手段,以及为什么它的工作原理。

0

这适用于命令行:
1.设置你的JSON像这样a={"op": "create","collection": "test","args": [{ "a": 1 },{ "b": 2 },{ "c": 3 }]}
2.管一个变种JQ到这样的'回声 “$ A” | jq -r .args