2012-04-28 68 views
7

Chuyển đổi này:Làm thế nào để trích xuất một đối tượng json đó là bên trong một đối tượng json

{"items":[{"id":"BLE89-A0-123-384","weight":"100","quantity":3}, 
      ...  
      {"id":"BLE10-A0-123-321","weight":"100","quantity":4}], 
"country":"JUS", 
"region":"A", 
... 
"timeout":"FILLER"} 

Để này:

{"BLE89-A0-123-384": "3", "BLE10-A0-123-321": "4"} đó là ... {id: số lượng}

Tôi tìm thấy một câu trả lời hầu như làm những gì tôi cần: Searching for an Object inside the JSON. Nhưng câu trả lời đó không giúp tôi bởi vì nó chỉ ở cấp độ đầu tiên (một đối tượng json). Vấn đề của tôi là ở cấp độ thứ hai (đối tượng json trong một đối tượng json). Cảm ơn trước!

+1

'{" BLE89-A0-123-384 "," 3 "; "BLE10-A0-123-321", "4"} 'Đó không phải là một đối tượng hợp lệ, nó cần phải là một cặp giá trị quan trọng. –

+0

xin lỗi, đã sửa nó! – mrmo123

+0

Điều gì * không * bạn biết cách làm? Bạn có biết làm thế nào để truy cập vào một thành viên của một mảng hoặc đối tượng? Bạn có biết làm thế nào để lặp lại một mảng? Bạn có biết cách tạo một đối tượng và gán cho nó các cặp khóa/giá trị mới không? Nó sẽ là tốt để biết chính xác những gì bạn cần giúp đỡ. –

Trả lời

21

Nó giúp nếu bạn không nghĩ đến đối tượng JSON như các đối tượng JSON. Khi bạn chạy một chuỗi JSON thông qua JSON.parse, nó là một đối tượng JavaScript gốc.

Trong JavaScript, có hai cách để truy cập các đối tượng.

Dot Notation

Các ký hiệu dấu chấm đi như thế này

myObject.name

Xem dot? Bạn có thể sử dụng để truy cập bất kỳ đối tượng nào thuộc tính (thực tế có thể là một đối tượng khác trong javascript, miễn là nó có tên ký hiệu chấm hợp lệ). Bạn không thể sử dụng các ký tự như -, . và ký tự khoảng trắng.

Bracket Notation (có thể tên khác)

myObject["variableName"]

Giống như ký hiệu dấu chấm nhưng cho phép một số nhân vật khác, như - và nhân vật không gian .. Liệu chính xác những điều tương tự.

Sử dụng các ký hiệu này hữu ích vì chúng tôi có thể truy cập các thuộc tính lồng nhau.

myObj.foo.bar.baz()

Bây giờ chúng ta hãy để đối tượng JSON của bạn ...

{"items":[{"id":"BLE89-A0-123-384","weight":"100","quantity":3,"stock":0},
{"id":"BLE10-A0-123-321","weight":"100","quantity":4,"stock":0}],

Bạn có thể muốn chải lên trên JSON format chính mình, nhưng trong ví dụ của bạn, đây là một vài manh mối .. .

{ Có nghĩa là bắt đầu một đối tượng. (Hãy nhớ toàn bộ chuỗi JSON của bạn là một đối tượng.)

} Có nghĩa là kết thúc của một đối tượng.

"variable" (có dấu ngoặc kép! Quan trọng trong JSON, nhưng không phải khi truy cập/khai báo đối tượng javascript) gán thuộc tính cho đối tượng của bạn.

: Là toán tử gán trong cả đối tượng JSON và JavaScript. Mọi thứ ở bên phải của : là giá trị bạn chỉ định cho thuộc tính ở bên trái.

, Có nghĩa là bạn đang bắt đầu một thuộc tính mới trong một đối tượng.

Bạn có thể biết rằng [] với , dấu phẩy bên trong có nghĩa là một mảng.

Khi chúng tôi chạy chuỗi của bạn thông qua JSON.parse(string), chúng tôi sẽ nhận được một đối tượng mà trông như thế này ...

var myResponse = JSON.parse(response);

Bây giờ bạn có thể sử dụng nó như là một đối tượng JavaScript bản địa. Những gì bạn đang tìm kiếm là thuộc tính lồng nhau trong "mục".

var items = myResponse.items; //alternatively you could just use myResponse.items

Kể từ items là một mảng của các đối tượng , chúng tôi sẽ cần phải lặp qua nó để chuyển đổi các đối tượng hiện có vào một đối tượng mới.

var i; 
var result = {} ; //declare a new object. 
for (i = 0; i < items.length; i++) { 
    var objectInResponse = items[i]; //get current object 
    var id = objectInResponse.id; //extract the id. 
    var quantity = objectInResponse.quantity; 
    result[id] = quantity; //use bracket notation to assign "BLE89-A0-123-384" 
    //instead of id. Bracket notation allows you to use the value 
    // of a variable for the property name. 

Kết quả bây giờ là một đối tượng mà trông giống như:

{ 
    "BLE89-A0-123-384" : 3, //additional properties designated by comma 
    "BLE10-A0-123-321" : 4 // The last key/value in an object literal CANNOT 
    // have a comma after it! 
} 

Bạn có thể truy cập vào các tính chất sử dụng ký hiệu khung.

var BLE89 = result["BLE10-A0-123-321"]; //use quotes, otherwise JavaScript will try to look up the value of a variable.

+0

+1 để được giải thích kỹ lưỡng. –

+0

Ồ, đó là một câu trả lời kỹ lưỡng hơn tôi mong đợi cho câu hỏi: D – epidemian

+0

cảm ơn vì câu trả lời tuyệt vời! – mrmo123

0

Bạn cần phải làm như sau:


var newJSON = {}; 
for (var i = 0; i < oldJSON.items.length; i++) { 
    newJSON[oldJSON.items[i].id] = oldJSON.items[i].quantity; 
} 
+0

'.length()' cần phải là '.length'. Độ dài là thuộc tính không phải là hàm. –

2

Bạn có thể thử với:

var obj = { 
    "items":[ 
     {"id":"BLE89-A0-123-384","weight":"100","quantity":3}, 
     {"id":"BLE10-A0-123-321","weight":"100","quantity":4} 
    ], 
    "country":"JUS", 
    "region":"A", 
    "timeout":"FILLER" 
}; 

var quantities = {}; 
obj.items.forEach(function (item) { 
    quantities[item.id] = item.quantity; 
}); 

quantities sau đó sẽ là đối tượng {"BLE89-A0-123-384":3,"BLE10-A0-123-321":4}. forEach là một phương thức gốc của các đối tượng mảng trong JavaScript cho phép bạn lặp qua các phần tử của chúng. Bạn có thể muốn đặt đoạn mã đó vào bên trong một hàm:

function getQuantities(obj) { 
    var quantities = {}; 
    obj.items.forEach(function (item) { 
     quantities[item.id] = item.quantity; 
    }); 
    return quantities; 
} 
+0

cảm ơn bạn !!!!!! – mrmo123

Các vấn đề liên quan