如何解析数组中的json对象

时间:2017-09-16 07:32:39

标签: javascript json parsing

我有一个像这样的json对象

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

我想打印出所有的args元素,然后将它们分开。这就是我解析json元素所做的,我能够得到" op"或"收集"元件。然而,我并没有得到" 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是创造 args是[object Object],[object Object],[object Object]

顺便说一句,我也试过使用stringfy方法,但它也不能正常工作

3 个答案:

答案 0 :(得分: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"完全是指一件事:一个字符串遵循特定的语法,代表一些数据。使用这种字符串表示是因为它可以在计算机系统(例如客户端和服务器)之间传递,并且以不同的语言使用。正如json.org网站所说(我的重点):

  

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

换句话说,JavaScript中的对象文字(例如{a: 1}或其定义的对象) JSON,永远不会是JSON,并且它不正确将它称为JSON,或称为" JSON对象" - 在世界上甚至不存在的东西,并且不能,因为JSON是一个字符串。 JavaScript中的一个对象只被称为一个东西: JavaScript对象,或者如果上下文清晰,只需对象(如果您想知道,它也从未被称为" hash",或" dictionary",或" associative array")。这样的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元素[原文如此],然后将它们分开[原文如此]。这就是我解析json元素所做的,我能够获得opcollection元素。但是,我没有得到args元素。

我知道不是每个人都是以英语为母语的人,但很难理解这句话。我想你的意思是"打印出args"的所有元素(复数)。我不知道你的意思"分开它们"。你的意思是逐个做一些元素吗?我也不知道你的意思"这就是我所做的解析json元素"。这是避免使用诸如"解析"之类的术语的完美示例。和" json"不正确;你只是让自己和其他人混淆。

如果您要说的是要逐个打印出args属性的元素,那么循环遍历数组元素的方法将在每个基本的JS教程和介绍中介绍:



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




for...of表单,如果你不熟悉它,你应该学习它,循环遍历数组的元素。

或者,当然您也可以使用常规for循环来遍历数组的索引,从0config.args.length。< / p>

但是,如果您想按属性细分{"a": 1}属性,并逐个打印每个属性及其值,该怎么办? (这可能就是你说的时候你的意思&#34;分开它们&#34;?)在这种情况下,我们需要一种方法来找到所有的属性,假设我们事先不知道它们。在任何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]的含义及其工作原理。

答案 1 :(得分:0)

你想要这样的东西吗?

所以config.args是一个数组,所以我们循环遍历数组(使用for(var x of config.args){),以获取内部的对象(例如:{ "a": 1 }),然后我们单独得到值从对象循环通过键(使用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);

答案 2 :(得分:0)

这适用于命令行:
1.将你的json设置为类似a={"op": "create","collection": "test","args": [{ "a": 1 },{ "b": 2 },{ "c": 3 }]}的var 2.管道到jq就像这样`echo'$ a“| jq -r .args