2012-11-05 41 views
0

我想要得到版本1和版本2下的孩子的名字。以下兒童的名字的例子是「客戶」和「發票」。穿越JSON得到孩子的名字

我怎樣才能得到它使用JavaScript?

我試過Errors.Version1。[0]得到的名字,但似乎沒有工作。我不想使用Errors.Version1.Customer,因爲它可以更改。它可以是「客戶」或「發票」。我只想得到它的名字。

謝謝!

JSON例如

{ 
    "Errors": [ 
    { 
     "Version1": { 
     "Customer": { 
      "BillAddr": { 
      "Id": "Id1", 
      "Line1": "Line11", 
      "Line2": "Line21", 
      "Line3": "Line31", 
      "Line4": "Line41", 
      "Line5": "Line51", 
      "City": "City1", 

      } 
     } 
     }, 
     "Version2": { 
     "Invoice": { 
      "BillAddr": { 
      "Id": "Id1", 
      "Line1": "Line11", 
      "Line2": "Line21", 
      "Line3": "Line31", 
      "Line4": "Line41", 
      "Line5": "Line51", 
      "City": "City1", 

      } 
     } 
     } 
    } 
    ] 
} 

回答

1

如果它永遠只能是一個或另一個,那麼就做一個簡單的測試:

var type = ("Customer" in Errors[0].Version1) ? "Customer" : "Invoice", 
    obj = Errors[0].Version1[type]; 

如果它不只是這兩個可能的結果更有活力,那麼你就需要通過做for ... in迭代對象的鍵。也就是說,如果你有這種數據格式的100%所有權,並且有能力改變它,我可能會建議刪除一個級別,而不是給出錯誤error_type屬性,而不是試圖猜測它?

{ 
    Errors : [{ 
     Version1 : { 
      ErrorType : "Customer", 
      BillAddr : { 
       Id : "Id1", 
       Line1 : "Line11", 
       Line2 : "Line21", 
       Line3 : "Line31", 
       Line4 : "Line41", 
       Line5 : "Line51", 
       City : "City1" 
      } 
     }, 

     Version2 : { /* ... */ } 
    }] 
} 

或者,你可以把VersionX一個數組,而不是一個對象,併爲此,你可以有多個錯誤,持有對象(用自己的錯誤類型屬性),此時,盤算通過:

Errors[0].Version1[0].ErrorType; 

變得非常簡單。

2

正確的符號是

Errors[0].Version1[0] // however still won't work 

因爲你在你的JSON有一個額外的陣列封裝和你混的符號。
但是,對象屬性不能被索引訪問,因爲它們的順序不能保證。因此,您需要將Version1Version2轉換爲數組,或者必須按名稱訪問屬性。

Errors[0].Version1["Customer"] //works for your current markup 

此外,使用點符號object.property括號符號object["property"] - 你不能混用。

下面將爲您的符號Errors.Version1[0]工作:

{ 
    "Errors": 
    { 
     "Version1": [ 
     { 
      "BillAddr": { 
      "Id": "Id1", 
      "Line1": "Line11", 
      "Line2": "Line21", 
      "Line3": "Line31", 
      "Line4": "Line41", 
      "Line5": "Line51", 
      "City": "City1", 

      } 
     } 
     ] 
    } 
} 

作爲陣列的順序是保證固定的,但你失去了信息的客戶,因爲數組沒有鑰匙,但只有指標。

2

不能將對象屬性引用爲索引;換句話說,你不能這樣做:

var foo = {a:1}; 
foo[0]; // Doesn't work 

什麼可以做,雖然是使用類似的語法作爲索引引用屬性:

var foo = {a:1}; 
foo[someBoolean ? 'Customer' : 'Invoice']; // Does work 

但是,如果你只是想獲得的任何屬性的一個對象,不管它們被命名了什麼?好吧,那麼你需要通過他們迭代:

var foo = {randomName:1}; 
for (var key in foo) { 
    // key=="randomName" 
    // foo[key]==foo["randomName"]==foo.randomName==1 
    // do whatever you want with foo[key]; 
} 

不過,我建議使用庫(包括下劃線或jQuery的有自己的「每個」功能),而不是原生JS,因爲如果你使用任何圖書館添加自定義屬性,他們可以搞砸了。

+1

所以然後使用'foo.hasOwnProperty(key)'來測試屬性是否被繼承。 –

+0

只是爲了更具體地指出什麼是機器主機,以及大衛在保護您。有些庫會豐富本地Object實現,如下所示:Object.prototype.anotherKey =「whatever」。這是不考慮其他代碼,在我看來是不好的,但是,這是語言的一部分。 – cbayram

+0

@cbayram這是原型繼承的工作原理,您可以通過將[enumerable屬性設置爲false]來繞過列出的屬性(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)。 – Christoph