2016-09-04 20 views
6

Gần đây tôi đã cố gắng lấy dữ liệu từ máy chủ với mô-đun Http của Elm và tôi bị kẹt với giải mã json thành các kiểu tùy chỉnh trong Elm.Giải mã Json Array với các đối tượng trong Elm

My JSON trông như thế:

[{ 
    "id": 1, 
    "name": "John", 
    "address": { 
     "city": "London", 
     "street": "A Street", 
     "id": 1 
    } 
}, 
{ 
    "id": 2, 
    "name": "Bob", 
    "address": { 
     "city": "New York", 
     "street": "Another Street", 
     "id": 1 
    } 
}] 

nào nên được giải mã để:

type alias Person = 
{ 
id : Int, 
name: String, 
address: Address 
} 

type alias Address = 
{ 
id: Int, 
city: String, 
street: String 
} 

gì tôi tìm thấy cho đến nay là tôi cần phải viết một hàm giải mã:

personDecoder: Decoder Person 
personDecoder = 
    object2 Person 
    ("id" := int) 
    ("name" := string) 

Điều đó cho hai thuộc tính đầu tiên nhưng cách tôi tích hợp thuộc tính Địa chỉ lồng nhau và cách kết hợp điều này để giải mã t anh ta liệt kê?

Trả lời

14

Trước tiên, bạn cần một Decoder Địa chỉ tương tự như Decoder Person của bạn

Edit: được nâng cấp để Elm 0,18

import Json.Decode as JD exposing (field, Decoder) 

addressDecoder : Decoder Address 
addressDecoder = 
    JD.map3 Address 
    (field "id" int) 
    (field "city" string) 
    (field "street" string) 

Sau đó, bạn có thể sử dụng cho lĩnh vực "địa chỉ":

personDecoder: Decoder Person 
personDecoder = 
    JD.map3 Person 
    (field "id" int) 
    (field "name" string) 
    (field "address" addressDecoder) 

Danh sách những người có thể được giải mã như sau:

personListDecoder : Decoder (List Person) 
personListDecoder = 
    JD.list personDecoder 
+0

Ok, cảm ơn bạn, nhưng làm cách nào tôi có thể kết hợp chúng để giải mã danh sách Người? – rubiktubik

+1

Tôi đã cập nhật câu trả lời để bao gồm bộ giải mã danh sách –

+0

Cảm ơn bạn! Giải pháp rất đẹp! – rubiktubik

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