Elm Language
Json.Decode
サーチ…
備考
Json.Decodeはペイロードをデコードする2つの関数を公開しています。最初はdecodeValueで、 Json.Encode.Valueをデコードしようとします。もう1つはdecodeStringでJSON文字列をデコードしようとします。どちらの関数も、2つのパラメータ、デコーダ、およびJson.Encode.ValueまたはJson文字列を取ります。
リストのデコード
次の例は、 https://ellie-app.com/m9tk39VpQg/0でテストできます 。
import Html exposing (..)
import Json.Decode
payload =
"""
["fu", "bar"]
"""
main =
Json.Decode.decodeString decoder payload -- Ok ["fu","bar"]
|> toString
|> text
decoder =
Json.Decode.list Json.Decode.string
フィールドをプリデコードし、そのデコードされた値に応じて残りをデコードする
次の例は、 https://ellie-app.com/m9vmQ8NcMc/0でテストできます 。
import Html exposing (..)
import Json.Decode
payload =
"""
[ { "bark": true, "tag": "dog", "name": "Zap", "playful": true }
, { "whiskers": true, "tag" : "cat", "name": "Felix" }
, {"color": "red", "tag": "tomato"}
]
"""
-- OUR MODELS
type alias Dog =
{ bark: Bool
, name: String
, playful: Bool
}
type alias Cat =
{ whiskers: Bool
, name: String
}
-- OUR DIFFERENT ANIMALS
type Animal
= DogAnimal Dog
| CatAnimal Cat
| NoAnimal
main =
Json.Decode.decodeString decoder payload
|> toString
|> text
decoder =
Json.Decode.field "tag" Json.Decode.string
|> Json.Decode.andThen animalType
|> Json.Decode.list
animalType tag =
case tag of
"dog" ->
Json.Decode.map3 Dog
(Json.Decode.field "bark" Json.Decode.bool)
(Json.Decode.field "name" Json.Decode.string)
(Json.Decode.field "playful" Json.Decode.bool)
|> Json.Decode.map DogAnimal
"cat" ->
Json.Decode.map2 Cat
(Json.Decode.field "whiskers" Json.Decode.bool)
(Json.Decode.field "name" Json.Decode.string)
|> Json.Decode.map CatAnimal
_ ->
Json.Decode.succeed NoAnimal
Rust enumからJSONをデコードする
これは、フロントエンドでバックエンドとelmでrustを使用する場合に便利です
enum Complex{
Message(String),
Size(u64)
}
let c1 = Complex::Message("hi");
let c2 = Complex::Size(1024u64);
錆のコード化されたJsonは次のようになります:
c1:
{"variant": "Message",
"fields": ["hi"]
}
c2:
{"variant": "Size",
"fields": [1024]
}
elmのデコーダ
import Json.Decode as Decode exposing (Decoder)
type Complex = Message String
| Size Int
-- decodes json to Complex type
complexDecoder: Decoder Value
complexDecoder =
("variant" := Decode.string `Decode.andThen` variantDecoder)
variantDecoder: String -> Decoder Value
variantDecoder variant =
case variant of
"Message" ->
Decode.map Message
("fields" := Decode.tuple1 (\a -> a) Decode.string)
"Size" ->
Decode.map Size
("fields" := Decode.tuple1 (\a -> a) Decode.int)
_ ->
Debug.crash "This can't happen"
使用法:http rest APIからデータが要求され、ペイロードのデコードが行われます。
Http.fromJson complexDecoder payload
文字列からのデコードは
Decode.decodeString complexDecoder payload
レコードのリストをデコードする
次のコードはデモでご覧いただけます: https : //ellie-app.com/mbFwJT9jD3/0
import Html exposing (..)
import Json.Decode exposing (Decoder)
payload =
"""
[{
"id": 0,
"name": "Adam Carter",
"work": "Unilogic",
"email": "[email protected]",
"dob": "24/11/1978",
"address": "83 Warner Street",
"city": "Boston",
"optedin": true
},
{
"id": 1,
"name": "Leanne Brier",
"work": "Connic",
"email": "[email protected]",
"dob": "13/05/1987",
"address": "9 Coleman Avenue",
"city": "Toronto",
"optedin": false
}]
"""
type alias User =
{ name: String
, work: String
, email: String
, dob: String
, address: String
, city: String
, optedin: Bool
}
main =
Json.Decode.decodeString decoder payload
|> toString
|> text
decoder: Decoder (List User)
decoder =
Json.Decode.map7 User
(Json.Decode.field "name" Json.Decode.string)
(Json.Decode.field "work" Json.Decode.string)
(Json.Decode.field "email" Json.Decode.string)
(Json.Decode.field "dob" Json.Decode.string)
(Json.Decode.field "address" Json.Decode.string)
(Json.Decode.field "city" Json.Decode.string)
(Json.Decode.field "optedin" Json.Decode.bool)
|> Json.Decode.list
日付をデコードする
あなたがこのようなISOの日付文字列を持つjsonを持っている場合
JSON.stringify({date: new Date()})
// -> "{"date":"2016-12-12T13:24:34.470Z"}"
elmにマップすることができますDate type:
import Html exposing (text)
import Json.Decode as JD
import Date
payload = """{"date":"2016-12-12T13:24:34.470Z"}"""
dateDecoder : JD.Decoder Date.Date
dateDecoder =
JD.string
|> JD.andThen ( \str ->
case Date.fromString str of
Err err -> JD.fail err
Ok date -> JD.succeed date )
payloadDecoder : JD.Decoder Date.Date
payloadDecoder =
JD.field "date" dateDecoder
main =
JD.decodeString payloadDecoder payload
|> toString
|> text
オブジェクトのリストを含むオブジェクトのリストをデコードする
実際の例はEllieを参照してください。この例では、 NoRedInk / elm-decode-pipelineモジュールを使用しています。
与えられたJSONオブジェクトのリストはJSONオブジェクトのリストを含んでいます:
[
{
"id": 0,
"name": "Item 1",
"transactions": [
{ "id": 0, "amount": 75.00 },
{ "id": 1, "amount": 25.00 }
]
},
{
"id": 1,
"name": "Item 2",
"transactions": [
{ "id": 0, "amount": 50.00 },
{ "id": 1, "amount": 15.00 }
]
}
]
上記の文字列がpayload文字列内にある場合は、次のようにしてデコードできます。
module Main exposing (main)
import Html exposing (..)
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Pipeline as JP
import String
type alias Item =
{ id : Int
, name : String
, transactions : List Transaction
}
type alias Transaction =
{ id : Int
, amount : Float
}
main =
Decode.decodeString (Decode.list itemDecoder) payload
|> toString
|> String.append "JSON "
|> text
itemDecoder : Decoder Item
itemDecoder =
JP.decode Item
|> JP.required "id" Decode.int
|> JP.required "name" Decode.string
|> JP.required "transactions" (Decode.list transactionDecoder)
transactionDecoder : Decoder Transaction
transactionDecoder =
JP.decode Transaction
|> JP.required "id" Decode.int
|> JP.required "amount" Decode.float
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow