2017-09-16 145 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