একটি JSON অবজেক্ট হলো, অন্য ভাষার পরিভাষায় বলতে গেলে, একটি "হ্যাশ", "ম্যাপ" বা "ডিকশনারি"।
JSON একটি অবজেক্ট-কে এভাবে সংজ্ঞায়িত করে:
একটি অবজেক্ট হলো নাম/মান জোড়ার একটি আনঅর্ডারড সেট। একটি অবজেক্ট
{বাম ব্রেস দিয়ে শুরু হয় এবং}ডান ব্রেস দিয়ে শেষ হয়। প্রতিটি নাম-এর পরে:কোলন থাকে এবং নাম/মান জোড়াগুলোকে,কমা দিয়ে আলাদা করা হয়।
নাম অবশ্যই একটি স্ট্রিং হতে হবে। নাম-এর আরেকটি শব্দ হলো কী (key)।
মান যেকোনো JSON টাইপের হতে পারে। একই অবজেক্টের ভিন্ন ভিন্ন মান ভিন্ন ভিন্ন টাইপের হতে পারে, যেমন এই উদাহরণটি।
{
"name": "Jane",
"age": 42,
"pets": ["cat", "fish"],
"address": {"street": "123 Main St", "city": "Springfield"}
}
লক্ষ্য করুন, শেষ কী (key)-মান জোড়ার পরে কোনো কমা থাকা যাবে না।
নাম/মান জোড়াগুলো সংগ্রহ করতে ব্রেস ব্যবহার করুন। যদিও নামগুলো অবশ্যই স্ট্রিং হতে হবে, তবুও নামগুলো আইডেন্টিফায়ার-এর মতো হলে (অ্যালফানিউমেরিক ক্যারেক্টার ও আন্ডারস্কোর দিয়ে গঠিত, এবং কোনো অঙ্ক দিয়ে শুরু হয় না) সেগুলোকে কোট করার প্রয়োজন নেই।
{name: "Jane", age: 42}
আইডেন্টিফায়ার-এর মতো নয় এমন কী (key) ব্যবহার করা বৈধ। শুধু সেগুলো কোট করুন।
{"first name": "Jane", "last name": "Lopez", age: 42}
যদি নামটি একটি এক্সপ্রেশনের ফলাফল হয়, তবে এক্সপ্রেশনটি অবশ্যই প্রথম বন্ধনীর ভিতরে থাকতে হবে।
$ echo "Jane" | jq -Rc '{.: 42}'
jq: error: syntax error, unexpected '.' (Unix shell quoting issues?) at <top-level>, line 1:
{.: 42}
jq: error: May need parentheses around object key expression at <top-level>, line 1:
{.: 42}
jq: 2 compile errors
$ echo "Jane" | jq -Rc '{(.): 42}'
{"Jane":42}
অবজেক্ট তৈরির কয়েকটি ঘন ঘন ব্যবহৃত ক্ষেত্রে শর্টহ্যান্ড সিনট্যাক্স আছে।
একটি ইনপুট অবজেক্ট থেকে কী (key)-মান জোড়া পুনরায় ব্যবহার করা।
$ jq -n '$ENV | {USER: .USER, EDITOR: .EDITOR}'
{
"USER": "glennj",
"EDITOR": "vim"
}
$ENV হলো একটি অবজেক্ট, যেখানে পরিবেশের নাম-মান জোড়াগুলো থাকে।
পুনরাবৃত্তিমূলক key: .key জোড়াগুলো শুধু key হিসেবে লেখা যায়
$ jq -n '$ENV | {USER, EDITOR}'
{
"USER": "glennj",
"EDITOR": "vim"
}
একইভাবে, ভ্যারিয়েবল ব্যবহার করার সময়ও একটি শর্টহ্যান্ড আছে।
$ jq -cn '"foo" as $a | "bar" as $b | {a: $a, b: $b}'
{"a":"foo","b":"bar"}
$ jq -cn '"foo" as $a | "bar" as $b | {$a, $b}'
{"a":"foo","b":"bar"}
অবজেক্ট থেকে মান ডট নোটেশন দিয়ে পাওয়া যায়।
{name: "Jane", age: 42} | .age # => 42
আপনি যদি কী (key)-কে একটি আইডেন্টিফায়ার হিসেবে উল্লেখ করতে না পারেন, তবে বন্ধনী নোটেশন ব্যবহার করুন।
"name" as $key | {name: "Jane", age: 42} | .$key # => error
"name" as $key | {name: "Jane", age: 42} | .[$key] # => "Jane"
অবজেক্টে কী (key) না থাকলে ফলাফল null হয়।
{name: "Jane", age: 42} | .sport # => null
আপনি দেখতে পাবেন যে API কোয়েরি থেকে ফলাফল পার্স করার সময় এটি আপনাকে বারবার করতে হয়।
অ্যারে বা অবজেক্ট মান ধারণ করে এমন একটি অবজেক্ট দেওয়া থাকলে, আমরা ইনডেক্স এক্সপ্রেশনগুলোকে একসাথে "চেইন" করতে পারি।
{
"name": "Jane",
"age": 42,
"pets": ["cat", "fish"],
"address": {"street": "123 Main St", "city": "Springfield"}
}
| (
.pets[1], # => "fish"
.address.city # => "Springfield"
)
অ্যারে-তে একটি নতুন কী (key)-মান জোড়া যোগ করতে, বা বিদ্যমান কোনো কী (key)-এর মান আপডেট করতে, বাম দিকে একটি ইনডেক্স এক্সপ্রেশন রেখে = অ্যাসাইনমেন্ট অপারেটর ব্যবহার করুন।
{name: "Jane", age: 42} | .sport = "tennis" | .age = 21
# => {
# "name": "Jane",
# "age": 21,
# "sport": "tennis"
# }
+ অপারেটর অবজেক্টগুলোকে মার্জ করবে।
{Richard: 54} + {Jane: 42}
# => {
# "Richard": 54,
# "Jane": 42
# }
একটি কী (key) মুছে ফেলতে del ফাংশন ব্যবহার করুন।
এটি আপডেট হওয়া অবজেক্টটি রিটার্ন করে।
{name: "Jane", age: 42} | del(.age) # => {"name": "Jane"}
del-এর প্যারামিটার হলো একটি ইনডেক্স এক্সপ্রেশন (ডট বা বন্ধনী নোটেশন ব্যবহার করে) যা অবজেক্টের একটি কী (key) নির্দেশ করে।
jq এটাকে পাথ এক্সপ্রেশন বলে।
শুধু একটি স্ট্রিং দিলেই যথেষ্ট নয়।
{name: "Jane", age: 42} | del(name) # error: name/0 is not defined
{name: "Jane", age: 42} | del("name") # error: Invalid path expression with result "name"
{name: "Jane", age: 42} | del(.name) # OK
{name: "Jane", age: 42} | del(.["name"]) # OK
অবজেক্টে কোনো কী (key) আছে কি না পরীক্ষা করতে, has ফাংশন ব্যবহার করুন।
{name: "Jane", age: 42} as $example
|
($example | has("name")), # => true
($example | has("sport")) # => false
in দিয়ে পরীক্ষা করুন কোনো কী (key) অবজেক্টে আছে কি না।
{name: "Jane", age: 42} as $example
|
("name" | in($example)), # => true
("sport" | in($example)) # => false
সব কী (key)-এর তালিকা আউটপুট করতে keys ফাংশন ব্যবহার করুন।
{name: "Jane", age: 42} | keys # => ["age", "name"]
লক্ষ্য করুন, keys কী (key)গুলোকে সাজিয়ে ফেলবে।
আসল ক্রমে কী (key)গুলো পেতে keys_unsorted ব্যবহার করুন।
সব মান তালিকা করার জন্য কোনো সমতুল্য ফাংশন নেই।
তবে .[] ফিল্টার অবজেক্টের মানগুলোকে একটি স্ট্রিম হিসেবে আউটপুট করে, এবং সেই স্ট্রিমকে [...] অ্যারে কনস্ট্রাক্টর দিয়ে ধরা যায়।
[{first: "Jane", last: "Lopez", status: "awesome!"} | .[]]
# => ["Jane", "Lopez", "awesome!"]
map_values(filter) ফাংশনটি অবজেক্টের প্রতিটি মান-এর উপর ফিল্টার প্রয়োগ করে।
{first: "Jane", last: "Lopez", status: "awesome!"}
| map_values(ascii_upcase)
# => {"first": "JANE", "last": "LOPEZ", "status": "AWESOME!"}
কোনো অবজেক্টের উপর ইটারেট করতে, প্রথমে এটিকে কী (key)-মান অবজেক্টের একটি অ্যারেতে রূপান্তর করতে হবে।
to_entries ফাংশনটি সেটিই করে।
{name: "Jane", age: 42} | to_entries
# => [
# {
# "key": "name",
# "value": "Jane"
# },
# {
# "key": "age",
# "value": 42
# }
# ]
এখন আমরা map-এর মতো অ্যারে ইটারেশন ফাংশন ব্যবহার করতে পারি।
from_entries ফাংশনটি এর বিপরীত: কী (key)-মান অবজেক্টের একটি অ্যারে থেকে একটি অবজেক্ট তৈরি করে।
[
{"key":"name", "value":"Jane"},
{"key":"age", "value":42}
] | from_entries # => {"name": "Jane", "age": 42}
অবজেক্টের প্রতিটি কী (key)-মান জোড়ার উপর ফিল্টার প্রয়োগ করতে, with_entries(filter) ফাংশন ব্যবহার করুন।
উদাহরণস্বরূপ, একটি নামকে বয়সের সাথে ম্যাপ করে এমন একটি অবজেক্ট দেওয়া থাকলে, কী (key) ও মানগুলোকে নিচের মতো অদলবদল করা যায়।
{"Jane": 42, "Richard": 54}
| with_entries({key: (.value | tostring), value: .key})
আউটপুট দেয়
{
"42": "Jane",
"54": "Richard"
}
with_entries(filter) নিম্নলিখিতটির সমান:
to_entries | map(filter) | from_entries