JSON (JavaScript Object Notation) হল একটি জনপ্রিয় ডেটা বিন্যাস, যা সাধারাণভাবে ওয়েব অ্যাপ্লিকেশন এবং API এর মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। Elm এ JSON ডেটা প্রসেসিং এবং ডিকোডিং করার জন্য Json.Decode মডিউল ব্যবহার করা হয়। এর মাধ্যমে আপনি JSON ডেটাকে Elm এর ডেটা টাইপে রূপান্তর করতে পারেন।
এখানে JSON ডেটা প্রসেসিং এবং ডিকোডিং এর পুরো প্রক্রিয়া এবং Elm-এ এর ব্যবহার বিস্তারিতভাবে আলোচনা করা হলো।
১. Json.Decode মডিউল ইমপোর্ট করা
প্রথমে, JSON ডেটা ডিকোড করতে Json.Decode মডিউল ইমপোর্ট করতে হয়।
import Json.Decode exposing (decodeString, field, string, int)এখানে, decodeString, field, string, এবং int ফাংশনগুলি ইমপোর্ট করা হয়েছে, যেগুলি JSON ডেটা ডিকোড করার জন্য ব্যবহৃত হবে।
২. JSON ডেটা ডিকোডিং
এখন, একটি JSON ডেটা স্ট্রিং ডিকোড করতে, আমাদের প্রথমে JSON ডেটার কাঠামো (structure) বুঝতে হবে এবং সেই অনুযায়ী Elm এর ডেটা টাইপ তৈরি করতে হবে।
উদাহরণ: JSON ডেটা ডিকোডিং
ধরা যাক, আমাদের একটি JSON ডেটা আছে যেটি একটি ব্যক্তির নাম এবং বয়স ধারণ করে:
{
"name": "John Doe",
"age": 30
}এটি Elm এ ডিকোড করার জন্য আমরা Json.Decode মডিউল ব্যবহার করব।
Elm কোড:
import Json.Decode exposing (decodeString, field, string, int)
type alias Person =
{ name : String
, age : Int
}
decodePerson : String -> Result String Person
decodePerson jsonString =
decodeString personDecoder jsonString
personDecoder : Json.Decode.Decoder Person
personDecoder =
map2 Person
(field "name" string)
(field "age" int)এখানে:
Personএকটি type alias তৈরি করা হয়েছে যাnameএবংageধারণ করবে।decodePersonফাংশনটি একটি JSON স্ট্রিং গ্রহণ করে এবং তাpersonDecoderব্যবহার করেPersonটাইপে ডিকোড করে।personDecoderহল একটি decoder যাnameএবংageফিল্ড ডিকোড করতেfieldফাংশন ব্যবহার করে।stringএবংintডেটা টাইপ দ্বারা মানগুলি নির্ধারণ করা হয়।
৩. JSON ডেটা ডিকোডের ফলাফল
Elm এ ডিকোডের ফলাফল সাধারণত Result টাইপের মাধ্যমে আসে, যা Ok (যদি ডেটা সঠিকভাবে ডিকোড হয়) অথবা Err (যদি কোনো ত্রুটি ঘটে) হতে পারে।
উদাহরণ:
testJson : String
testJson = """
{
"name": "John Doe",
"age": 30
}
"""
main =
case decodePerson testJson of
Ok person ->
text ("Name: " ++ person.name ++ ", Age: " ++ String.fromInt(person.age))
Err error ->
text ("Error: " ++ error)এখানে:
decodePersonফাংশনটিtestJsonস্ট্রিংকে ডিকোড করতে চেষ্টা করবে।- যদি ডিকোড সফল হয়,
Okএর ভিতরেPersonঅবজেক্টটি থাকবে এবং আমরা তা UI-তে প্রদর্শন করব। - যদি কোনো ত্রুটি ঘটে,
Errএর মাধ্যমে ত্রুটি বার্তা প্রদর্শন করা হবে।
৪. Nested JSON (নেস্টেড JSON ডেটা)
অধিকাংশ সময় JSON ডেটা নেস্টেড (অর্থাৎ অন্য JSON অবজেক্ট বা অ্যারে ধারণ করে) হতে পারে। এই ধরনের ডেটা ডিকোড করার জন্যও আমরা Json.Decode মডিউল ব্যবহার করি, তবে কিছু অতিরিক্ত স্টেপ প্রয়োজন হয়।
উদাহরণ: Nested JSON ডেটা
ধরা যাক, আমাদের একটি JSON ডেটা রয়েছে যেখানে address একটি অবজেক্ট:
{
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Elm St",
"city": "Metropolis"
}
}Elm কোড:
import Json.Decode exposing (decodeString, field, string, int, map2)
type alias Address =
{ street : String
, city : String
}
type alias Person =
{ name : String
, age : Int
, address : Address
}
decodePerson : String -> Result String Person
decodePerson jsonString =
decodeString personDecoder jsonString
personDecoder : Json.Decode.Decoder Person
personDecoder =
map3 Person
(field "name" string)
(field "age" int)
(field "address" addressDecoder)
addressDecoder : Json.Decode.Decoder Address
addressDecoder =
map2 Address
(field "street" string)
(field "city" string)এখানে:
addressDecoderএকটি ডিকোডার তৈরি করা হয়েছে যাstreetএবংcityফিল্ডগুলি ডিকোড করবে এবং সেগুলিAddressটাইপে রূপান্তর করবে।personDecoderএইaddressDecoderব্যবহার করেaddressফিল্ডটি ডিকোড করবে।
৫. JSON এ অ্যারে ডেটা ডিকোড করা
ধরা যাক, আমাদের JSON ডেটাতে একটি অ্যারে রয়েছে:
[
{ "name": "John", "age": 30 },
{ "name": "Alice", "age": 25 }
]Elm কোড:
import Json.Decode exposing (decodeString, field, string, int, list)
type alias Person =
{ name : String
, age : Int
}
decodePersons : String -> Result String (List Person)
decodePersons jsonString =
decodeString (list personDecoder) jsonString
personDecoder : Json.Decode.Decoder Person
personDecoder =
map2 Person
(field "name" string)
(field "age" int)এখানে:
decodePersonsফাংশনটি একটি JSON স্ট্রিং ধারণকারী Person অবজেক্টের একটি লিস্ট ডিকোড করবে।listফাংশনটি একটি JSON অ্যারে ডিকোড করার জন্য ব্যবহার করা হয়েছে।
৬. Error Handling with Decoding
Elm তে JSON ডিকোডিং-এর সময় যদি ডেটা সঠিক না থাকে, তবে ত্রুটি ঘটতে পারে। এই ত্রুটিগুলির মোকাবিলা করার জন্য Result টাইপ ব্যবহার করা হয়, যা Ok বা Err মান প্রদান করে।
উদাহরণ:
decodeJson : String -> Result String Person
decodeJson jsonString =
case decodeString personDecoder jsonString of
Ok person -> Ok person
Err error -> Err ("Decoding failed: " ++ error)এখানে, যদি ডেটা ডিকোড করতে ব্যর্থ হয়, তাহলে Err এর মাধ্যমে ত্রুটি বার্তা প্রদান করা হয়।
উপসংহার
Elm তে JSON ডেটা প্রসেসিং এবং ডিকোডিং একটি গুরুত্বপূর্ণ কাজ, বিশেষত যখন আপনি API থেকে ডেটা গ্রহণ করছেন। Json.Decode মডিউল ব্যবহার করে সহজে JSON ডেটাকে Elm এর টাইপে রূপান্তর করা যায় এবং এতে ত্রুটির ক্ষেত্রে কার্যকরী error handling করা সম্ভব হয়। JSON ডেটা ডিকোড করতে decodeString, field, map2, list ইত্যাদি ফাংশনগুলি ব্যবহৃত হয়, যা ডেটা স্ট্রাকচারের উপর নির্ভর করে কাস্টম ডিকোডার তৈরি করতে সহায়তা করে।
Read more