Elm Language
Json.Decode
खोज…
टिप्पणियों
Json.Decode एक पेलोड को डिकोड करने के लिए दो कार्यों को उजागर करता है, पहला एक decodeValue जो एक Json.Encode.Value को डीकोड करने की कोशिश करता है, दूसरा एक 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
JSON को रस्ट एनम से डिकोड करना
यह उपयोगी है यदि आप बैकएंड और एल्म में जंग का उपयोग सामने के छोर पर करते हैं
enum Complex{
Message(String),
Size(u64)
}
let c1 = Complex::Message("hi");
let c2 = Complex::Size(1024u64);
जंग से एन्कोडेड जोंस होगा:
c1:
{"variant": "Message",
"fields": ["hi"]
}
c2:
{"variant": "Size",
"fields": [1024]
}
एल्म में डिकोडर
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 बाकी एपीआई से अनुरोध किया गया है और पेलोड का डिकोडिंग होगा
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
डेट को डेट करें
मामले में आप इस तरह एक आईएसओ तारीख स्ट्रिंग के साथ json है
JSON.stringify({date: new Date()})
// -> "{"date":"2016-12-12T13:24:34.470Z"}"
आप इसे एल्म Date प्रकार में मैप कर सकते हैं:
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
वस्तुओं की सूची सहित वस्तुओं की सूची को डिकोड करें
एक कार्यकारी उदाहरण के लिए ऐली देखें। यह उदाहरण NoRedInk / elm-decode-पाइपलाइन मॉड्यूल का उपयोग करता है।
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