আমি কীভাবে স্ট্রিং অবজেক্টকে হ্যাশ অবজেক্টে রূপান্তর করব?


136

আমার কাছে একটি স্ট্রিং রয়েছে যা দেখতে হ্যাশের মতো দেখাচ্ছে:

"{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }"

আমি কীভাবে এর থেকে হ্যাশ পেতে পারি? মত:

{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }

স্ট্রিংয়ের বাসা বাঁধার কোনও গভীরতা থাকতে পারে। এটিতে রুবিতে কীভাবে একটি বৈধ হ্যাশ টাইপ করা হয় তার সমস্ত বৈশিষ্ট্য রয়েছে।


আমি মনে করি ইওল এখানে কিছু করবে। আমাকে প্রথমে পরীক্ষা দিন। আমি মনে করি খুব তাড়াতাড়ি প্রশ্নটি পোস্ট করেছি। :)
ওয়াসিম

ওহ হ্যাঁ, এটি এভালটি পাস করুন। :)
ওয়াসিম

উত্তর:


79

কল করে তৈরি করা স্ট্রিংটি কল করে হ্যাশে Hash#inspectপরিণত করা যেতে পারে eval। তবে এটির জন্য হ্যাশের সমস্ত বস্তুর ক্ষেত্রে একই হওয়া দরকার।

যদি আমি হ্যাশ দিয়ে শুরু করি {:a => Object.new}তবে এর স্ট্রিং প্রতিনিধিত্ব হ'ল "{:a=>#<Object:0x7f66b65cf4d0>}"এবং আমি evalএটিকে আবার হ্যাশে পরিণত করতে ব্যবহার করতে পারি না কারণ #<Object:0x7f66b65cf4d0>বৈধ রুবি সিনট্যাক্স নয়।

তবে, হ্যাশের সমস্ত কিছু যদি স্ট্রিং, চিহ্ন, সংখ্যা এবং অ্যারে হয় তবে এটি কাজ করা উচিত, কারণ তাদের স্ট্রিং উপস্থাপনা যা বৈধ রুবি সিনট্যাক্স।


"হ্যাশের সমস্ত কিছু যদি স্ট্রিং, চিহ্ন এবং সংখ্যা হয় তবে"। এটি অনেক কিছু বলে। সুতরাং আমি evalউপরের বিবৃতিটি স্ট্রিংয়ের জন্য বৈধ কিনা তা নিশ্চিত করে একটি হ্যাশ হিসাবে উত্সাহিত করার জন্য একটি স্ট্রিংয়ের বৈধতা পরীক্ষা করতে পারি ।
ওয়াসিম 14

1
হ্যাঁ, তবে এটি করার জন্য আপনাকে একটি সম্পূর্ণ রুবি পার্সার প্রয়োজন, অথবা স্ট্রিংটি প্রথম স্থানটি কোথা থেকে এসেছে তা জানতে হবে এবং এটি কেবল স্ট্রিং, চিহ্ন এবং সংখ্যা তৈরি করতে পারে। (স্ট্রিংয়ের বিষয়বস্তু বিশ্বাসের বিষয়ে টমস মিকোসের উত্তরও দেখুন))
কেন ব্লুম

13
আপনি যেখানে এটি ব্যবহার করেন সেখানে যত্নবান হন। evalভুল জায়গায় ব্যবহার করা একটি বিশাল সুরক্ষা গর্ত। স্ট্রিংয়ের ভিতরে যে কোনও কিছু, মূল্যায়ন করা হবে। তাই ভাবুন যদি কোনও rm -fr
এপিআইতে

153

বিভিন্ন স্ট্রিংয়ের জন্য, আপনি বিপজ্জনক evalপদ্ধতি ব্যবহার না করে এটি করতে পারেন :

hash_as_string = "{\"0\"=>{\"answer\"=>\"1\", \"value\"=>\"No\"}, \"1\"=>{\"answer\"=>\"2\", \"value\"=>\"Yes\"}, \"2\"=>{\"answer\"=>\"3\", \"value\"=>\"No\"}, \"3\"=>{\"answer\"=>\"4\", \"value\"=>\"1\"}, \"4\"=>{\"value\"=>\"2\"}, \"5\"=>{\"value\"=>\"3\"}, \"6\"=>{\"value\"=>\"4\"}}"
JSON.parse hash_as_string.gsub('=>', ':')

2
এই উত্তরটি eval ব্যবহার এড়ানোর জন্য নির্বাচন করা উচিত।
মাইকেল_জ্যাং

4
আপনার নীলগুলিও প্রতিস্থাপন করা উচিত, ফেJSON.parse(hash_as_string.gsub("=>", ":").gsub(":nil,", ":null,"))
ইয়ো লুডকে

136

দ্রুত এবং নোংরা পদ্ধতি হবে

eval("{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, :key_b => { :key_1b => 'value_1b' } }") 

তবে এর কঠোর সুরক্ষা জড়িত।
এটি যা যা পাস তা কার্যকর করে, আপনি অবশ্যই ১১০% নিশ্চিত (যেমন অন্তত কোনও পথে কোনও ইউজার ইনপুট নেই) এতে কেবল সঠিকভাবে গঠিত হ্যাশ বা বহিরাগত স্থান থেকে অপ্রত্যাশিত বাগ / ভয়াবহ প্রাণী উপস্থিত হতে পারে start


16
আমার সাথে হালকা সাবার আছে। আমি এই প্রাণী এবং বাগগুলির যত্ন নিতে পারি। :)
ওয়াসিম

12
আমার শিক্ষকের মতে এখানে এভাল ব্যবহার করা বিপজ্জনক হতে পারে। ইভাল যে কোনও রুবি কোড নেয় এবং এটি চালায়। এখানে বিপদটি এসকিউএল ইঞ্জেকশন বিপদের সাথে সাদৃশ্যপূর্ণ। গসুব পছন্দসই।
বোল্ডার_রবি

9
উদাহরণ দেখাচ্ছে কেন ডেভিড এর শিক্ষক সঠিক: STRING '{: বিস্ময় => "# {সিস্টেম \" RM -rf * \ "}"}'
এ উইলসন

13
আমি এখানে পর্যাপ্ত পরিমাণে EVAL ব্যবহারের বিপদকে জোর দিতে পারি না! এটি যদি সম্পূর্ণরূপে নিষিদ্ধ হয় তবে যদি ব্যবহারকারী ইনপুটটি আপনার স্ট্রিংটিতে প্রবেশ করতে পারে।
ডেভ কলিন্স

এমনকি যদি আপনি ভাবেন যে আপনি এটিকে আর প্রকাশ্যে কখনও খুলবেন না, অন্য কেউ হতে পারে। কোডগুলি কীভাবে আপনি কীভাবে প্রত্যাশা করতেন তা কীভাবে ব্যবহৃত হয় তা আমরা সকলেই (উচিত) জানি। এটি অত্যন্ত ভারী জিনিসকে একটি উচ্চ শেল্ফের উপরে রাখার মতো, এটি শীর্ষে ভারী করে তোলার মতো। আপনার বিপদটি এই ফর্মটি তৈরি করা উচিত নয়।
স্টিভ শেথার

24

YAML.load?


(লোড পদ্ধতি স্ট্রিংগুলিকে সমর্থন করে)
নীরব

5
এটির জন্য সম্পূর্ণ ভিন্ন স্ট্রিং প্রতিনিধিত্ব প্রয়োজন, তবে এটি অনেক বেশি নিরাপদ। (এবং স্ট্রিংয়ের উপস্থাপনা উত্পন্ন করা ঠিক তত সহজ - # ইনস্পেক্টের পরিবর্তে কেবল # টো_মায়ালকে কল করুন)
কেন ব্লুম

কি দারুন. আমার কোনও ধারণা ছিল না যে স্ট্রিং ডাব্লু / ইয়ামল পার্স করা এত সহজ। এটি আমার লিনাক্স ব্যাশ কমান্ডগুলির শৃঙ্খলে লাগে যা ডেটা উত্পন্ন করে এবং বুদ্ধি করে এটি রুবি হ্যাশ ডাব্লু / ও কোনও স্ট্রিং বিন্যাসের ম্যাসেজ হিসাবে রূপান্তরিত করে।
গোলকধাঁধা

স্ট্রিংটি যেভাবে উত্পাদিত হচ্ছে তার কিছুটা নিয়ন্ত্রণ করার কারণে এটি এবং টো_মায়াল আমার সমস্যা সমাধান করে। ধন্যবাদ!
মেলাবারকা

23

এই ছোট্ট ছোট্ট স্নিপেটটি এটি করবে তবে আমি এটি নেস্টেড হ্যাশ দিয়ে কাজ করতে দেখতে পাচ্ছি না। আমি যদিও এটি বেশ সুন্দর

STRING.gsub(/[{}:]/,'').split(', ').map{|h| h1,h2 = h.split('=>'); {h1 => h2}}.reduce(:merge)

পদক্ষেপ ১। আমি '{', '}' এবং ':' কে মুছে ফেলি 2. a '=>'। তারপরে, আমি হ্যাশের দুটি দিক দিয়ে একটি হ্যাশ তৈরি করেছি যা আমি কেবল আলাদা হয়ে গেল। ৪. আমি হ্যাশগুলির একটি অ্যারে রেখে এসেছি যা আমি তারপরে একত্রে মিশে যাই।

উদাহরণ ইনপুট: "{: ইউজার_আইডি => ১১,: ব্লগ_আইডি => ২,: কমেন্ট_আইডি => ১ R" ফলাফল আউটপুট: {"ইউজার_আইডি" => "১১", "ব্লগ_আইডি" => "২", "মন্তব্য_আইডি" = > "1"}


1
সে একজন অসুস্থ অনেলাইনার! :) +1
blushrt

3
এটি কি স্ট্রিংযুক্ত হ্যাশের অভ্যন্তরের মানগুলি{}: থেকে অক্ষরগুলি সরিয়ে ফেলবে না?
ভ্লাদিমির পানতেলিভ

@ ভ্লাদিমিরপান্তলেভ আপনি ঠিক বলেছেন, তাই হবে। সুন্দর ক্যাচ! আপনি যে কোনও দিন আমার কোড পর্যালোচনা করতে পারেন :)
hrdwdmrbl

20

সমাধানগুলি এখনও অবধি কিছু কেস কভার করে তবে কিছু মিস করে (নীচে দেখুন)। আরও বিশদ (নিরাপদ) রূপান্তর করার জন্য এখানে আমার প্রচেষ্টা। আমি একটি কোণার কেস সম্পর্কে জানি যা এই সমাধানটি হ্যান্ডেল করে না যা একক চরিত্রের প্রতীক যা বিজোড়, কিন্তু অনুমোদিত অক্ষরগুলি দিয়ে তৈরি। উদাহরণস্বরূপ {:> => :<}একটি বৈধ রুবি হ্যাশ।

আমি এই কোডটি গিথুবেও রেখেছি । সমস্ত রূপান্তর অনুশীলন করতে এই কোডটি একটি পরীক্ষার স্ট্রিং দিয়ে শুরু হয়

require 'json'

# Example ruby hash string which exercises all of the permutations of position and type
# See http://json.org/
ruby_hash_text='{"alpha"=>{"first second > third"=>"first second > third", "after comma > foo"=>:symbolvalue, "another after comma > foo"=>10}, "bravo"=>{:symbol=>:symbolvalue, :aftercomma=>10, :anotheraftercomma=>"first second > third"}, "charlie"=>{1=>10, 2=>"first second > third", 3=>:symbolvalue}, "delta"=>["first second > third", "after comma > foo"], "echo"=>[:symbol, :aftercomma], "foxtrot"=>[1, 2]}'

puts ruby_hash_text

# Transform object string symbols to quoted strings
ruby_hash_text.gsub!(/([{,]\s*):([^>\s]+)\s*=>/, '\1"\2"=>')

# Transform object string numbers to quoted strings
ruby_hash_text.gsub!(/([{,]\s*)([0-9]+\.?[0-9]*)\s*=>/, '\1"\2"=>')

# Transform object value symbols to quotes strings
ruby_hash_text.gsub!(/([{,]\s*)(".+?"|[0-9]+\.?[0-9]*)\s*=>\s*:([^,}\s]+\s*)/, '\1\2=>"\3"')

# Transform array value symbols to quotes strings
ruby_hash_text.gsub!(/([\[,]\s*):([^,\]\s]+)/, '\1"\2"')

# Transform object string object value delimiter to colon delimiter
ruby_hash_text.gsub!(/([{,]\s*)(".+?"|[0-9]+\.?[0-9]*)\s*=>/, '\1\2:')

puts ruby_hash_text

puts JSON.parse(ruby_hash_text)

এখানে অন্যান্য সমাধানগুলির জন্য কয়েকটি নোট এখানে দেওয়া হয়েছে

  • @ কেন ব্লুম এবং @ টমস মিকোসসের সমাধানগুলি ব্যবহার evalযা আমার পক্ষে খুব ভীতিজনক (যেমন টমস যথাযথভাবে তুলে ধরেছে)।
  • @zolter এর সমাধান কাজ করে যদি আপনার হ্যাশ কোন চিহ্ন বা সাংখ্যিক কী হয়েছে।
  • @jackquack এর সমাধান কাজ করে সেখানে চিহ্ন দিয়ে মিশিয়ে কোন উদ্ধৃতিচিহ্ন সহ পংক্তি হয়।
  • আপনার প্রতীকগুলিতে সমস্ত অনুমোদিত অক্ষর ব্যবহার না করা হলে ( ইউজিনের অক্ষরে অক্ষরের বিস্তৃত সংকলনের চিহ্ন চিহ্নগুলিতে ) ইউজিনের সমাধান কাজ করে ।
  • @ পাবলো এর সমাধান ততক্ষণ কাজ করবে যতক্ষণ না আপনার কাছে চিহ্ন এবং উদ্ধৃত স্ট্রিংগুলির মিশ্রণ নেই।

খুব শীতল সমাধান। আপনি সমস্ত একটি gsub যোগ করতে পারিনি :nilকরার :nullহাতল সেই বিশেষ weirdness করতে।
স্টিভটুরজিন

1
এই সমাধানটিতে পুনরাবৃত্তভাবে মাল্টি-লেভেল হ্যাশগুলিতে কাজ করার বোনাস রয়েছে, যেহেতু এটি জেএসএন # পার্সের উপার্জন করে। অন্যান্য সমাধানগুলিতে বাসা বাঁধতে আমার কিছুটা সমস্যা হয়েছিল।
প্যাট্রিক পড়ুন

17

আমারও একই সমস্যা ছিল। আমি রেডিসে একটি হ্যাশ সঞ্চয় করছিলাম। সেই হ্যাশটি পুনরুদ্ধার করার সময়, এটি একটি স্ট্রিং ছিল। eval(str)সুরক্ষা উদ্বেগের কারণে আমি কল করতে চাইনি । আমার সমাধানটি হ'ল রুশ হ্যাশ স্ট্রিংয়ের পরিবর্তে জ্যাসন স্ট্রিং হিসাবে হ্যাশ সংরক্ষণ করা। আপনার যদি বিকল্প থাকে তবে জসন ব্যবহার করা আরও সহজ।

  redis.set(key, ruby_hash.to_json)
  JSON.parse(redis.get(key))

টিএল; ডিআর: ব্যবহার to_jsonএবংJSON.parse


1
এটি এখন পর্যন্ত সেরা উত্তর। to_jsonএবংJSON.parse
আরডোচিঘ

3
যে আমাকে হ্রাস করেছে। কেন? আমার একই সমস্যা ছিল, একটি রুবি হ্যাশের একটি স্ট্রিং প্রতিনিধিত্বকে একটি আসল হ্যাশ বস্তুতে রূপান্তর করার চেষ্টা করছি। আমি বুঝতে পারি যে আমি ভুল সমস্যাটি সমাধান করার চেষ্টা করছি। আমি বুঝতে পারি যে এখানে জিজ্ঞাসা করা প্রশ্নটি সমাধান করা ত্রুটি প্রবণ এবং অনিরাপদ। আমি বুঝতে পেরেছিলাম যে আমার ডেটা আলাদাভাবে সঞ্চয় করতে হবে এবং একটি ফর্ম্যাট ব্যবহার করা উচিত যা অবজেক্টগুলিকে নিরাপদে সিরিয়ালাইজ করতে এবং ডিজাইরিয়াল করার জন্য ডিজাইন করা হয়েছে। টিএল; ডিআর: আমার ওপি-র মতো একই প্রশ্ন ছিল এবং বুঝতে পেরেছিলাম যে উত্তরটি একটি আলাদা প্রশ্ন জিজ্ঞাসা করবে। এছাড়াও, আপনি যদি আমাকে ভোট দেন, দয়া করে প্রতিক্রিয়া জানান যাতে আমরা সবাই মিলে শিখতে পারি।
জারেড মেনার্ড

3
কোনও ব্যাখ্যামূলক মন্তব্য ছাড়াই ডাউনভোটিং হ'ল স্ট্যাক ওভারফ্লোয়ের ক্যান্সার।
আরডোচিঘ

1
হ্যাঁ ডাউনভোটিংয়ের একটি ব্যাখ্যা দরকার এবং দেখানো উচিত কে কাকে নীচে ফেলে।
নিক রেস

2
এই উত্তরটি ওপি-র প্রশ্নের ক্ষেত্রে আরও প্রযোজ্য করার জন্য, যদি আপনার হ্যাশের স্ট্রিং উপস্থাপনাকে 'স্ট্রংআউট' বলা হয় তবে আপনি হ্যাশিট = জেএসএন.পারস (স্ট্রংআউট. টো_জসন) করতে সক্ষম হবেন এবং তারপরে হ্যাশিটের মাধ্যমে আপনার আইটেমগুলি নির্বাচন করুন [ 'কী-নাম'] স্বাভাবিক হিসাবে।
সিক্সেলসাইড

11

আমি অ্যাক্টিভসপোর্ট :: জেএসওএন অপব্যবহার করতে পছন্দ করি। তাদের পদ্ধতির হ্যাশটিকে ইয়ামলে রূপান্তর করা এবং তারপরে এটি লোড করা। দুর্ভাগ্যক্রমে ইয়ামলে রূপান্তরটি সহজ নয় এবং আপনার প্রকল্পে ইতিমধ্যে যদি আপনার না থাকে তবে আপনি সম্ভবত এএস এর কাছ থেকে ধার নিতে চাইবেন to

আমাদের কোনও চিহ্নকে নিয়মিত স্ট্রিং-কীতে রূপান্তর করতে হবে কারণ JSON এ প্রতীকগুলি উপযুক্ত নয়।

তবে, এটিতে একটি তারিখের স্ট্রিং রয়েছে এমন হ্যাশগুলি পরিচালনা করতে অক্ষম (আমাদের তারিখের স্ট্রিংগুলি স্ট্রিং দ্বারা ঘিরে থাকবে না, যেখানে বড় সমস্যাটি আসে):

স্ট্রিং = 'last' সর্বশেষ_সংস্থান_আত ': 2011-12-28 23:00:00 ইউটিসি}' ActiveSupport::JSON.decode(string.gsub(/:([a-zA-z])/,'\\1').gsub('=>', ' : '))

তারিখের মানটিকে পার্স করার চেষ্টা করলে এটি একটি অকার্যকর JSON স্ট্রিং ত্রুটির ফলত।

এই কেসটি কীভাবে পরিচালনা করবেন সে সম্পর্কে কোনও পরামর্শ পছন্দ করবেন


2
.ডেকোডের পয়েন্টারের জন্য ধন্যবাদ, এটি আমার পক্ষে দুর্দান্ত কাজ করেছে। এটি পরীক্ষা করার জন্য আমার একটি জেএসএন প্রতিক্রিয়া রূপান্তরিত করতে হবে। আমি যে কোডটি ব্যবহার করেছি তা এখানে:ActiveSupport::JSON.decode(response.body, symbolize_keys: true)
অ্যান্ড্রু ফিলিপস

9

রেল ৪.১ এ কাজ করে এবং উদ্ধৃতিগুলি ছাড়াই প্রতীকগুলি সমর্থন করে: a => 'বি'}

শুধু এটিকে আরম্ভকারী ফোল্ডারে যুক্ত করুন:

class String
  def to_hash_object
    JSON.parse(self.gsub(/:([a-zA-z]+)/,'"\\1"').gsub('=>', ': ')).symbolize_keys
  end
end

কমান্ড লাইনে কাজ করে, তবে আমি যখন এটি কোনও অন্তর্নিবেশকারীকে রাখি তখন আমি "স্ট্যাকের স্তর থেকে গভীর" হয়ে যাই ...
অ্যালেক্স এডেলস্টাইন

2

আমি একটি মণি হ্যাশ_পার্সার তৈরি করেছি যা প্রথমে পরীক্ষা করে দেখায় যে কোনও হ্যাশ নিরাপদ কিনা তা ruby_parserরত্ন ব্যবহার না করে । তবেই এটি প্রয়োগ করে eval

আপনি এটি হিসাবে ব্যবহার করতে পারেন

require 'hash_parser'

# this executes successfully
a = "{ :key_a => { :key_1a => 'value_1a', :key_2a => 'value_2a' }, 
       :key_b => { :key_1b => 'value_1b' } }"
p HashParser.new.safe_load(a)

# this throws a HashParser::BadHash exception
a = "{ :key_a => system('ls') }"
p HashParser.new.safe_load(a)

Https://github.com/bibstha/ruby_hash_parser/blob/master/test/test_hash_parser.rb এর পরীক্ষাগুলি আপনাকে নিশ্চিত করে তুলতে যে পরীক্ষা করেছি সেগুলির আরও উদাহরণ দেয় examples


2

এই সমাধান বিবেচনা করুন। লাইব্রেরী + + বৈশিষ্ট:

ফাইল lib/ext/hash/from_string.rb:

require "json"

module Ext
  module Hash
    module ClassMethods
      # Build a new object from string representation.
      #
      #   from_string('{"name"=>"Joe"}')
      #
      # @param s [String]
      # @return [Hash]
      def from_string(s)
        s.gsub!(/(?<!\\)"=>nil/, '":null')
        s.gsub!(/(?<!\\)"=>/, '":')
        JSON.parse(s)
      end
    end
  end
end

class Hash    #:nodoc:
  extend Ext::Hash::ClassMethods
end

ফাইল spec/lib/ext/hash/from_string_spec.rb:

require "ext/hash/from_string"

describe "Hash.from_string" do
  it "generally works" do
    [
      # Basic cases.
      ['{"x"=>"y"}', {"x" => "y"}],
      ['{"is"=>true}', {"is" => true}],
      ['{"is"=>false}', {"is" => false}],
      ['{"is"=>nil}', {"is" => nil}],
      ['{"a"=>{"b"=>"c","ar":[1,2]}}', {"a" => {"b" => "c", "ar" => [1, 2]}}],
      ['{"id"=>34030, "users"=>[14105]}', {"id" => 34030, "users" => [14105]}],

      # Tricky cases.
      ['{"data"=>"{\"x\"=>\"y\"}"}', {"data" => "{\"x\"=>\"y\"}"}],   # Value is a `Hash#inspect` string which must be preserved.
    ].each do |input, expected|
      output = Hash.from_string(input)
      expect([input, output]).to eq [input, expected]
    end
  end # it
end

1
it "generally works" কিন্তু অগত্যা না? আমি এই পরীক্ষাগুলিতে আরও ভারবোজ হতে হবে। it "converts strings to object" { expect('...').to eql ... } it "supports nested objects" { expect('...').to eql ... }
লেक्स

আরে @ লেক্স, কী পদ্ধতিটি তার রবিডক মন্তব্যে বর্ণিত হয়েছে। পরীক্ষা আরও ভাল করে এটি আবার বিবৃত না করে, এটি প্যাসিভ পাঠ্য হিসাবে অপ্রয়োজনীয় বিশদ তৈরি করবে। সুতরাং, "সাধারণভাবে কাজ করে" একটি ভাল সূত্র যা স্টাফটি ভাল, সাধারণত কার্যকরভাবে কাজ করে state চিয়ার্স!
অ্যালেক্স ফোর্টুনা

হ্যাঁ, দিন শেষে যা কিছু কাজ করে। কোন পরীক্ষা কোন পরীক্ষার চেয়ে ভাল। ব্যক্তিগতভাবে আমি সুস্পষ্ট বর্ণনার একটি অনুরাগী, তবে এটি কেবল একটি পছন্দকেই পছন্দ করে।
লেক্স

1

এই উদ্দেশ্যে ওয়ান-লাইন লেখার পরে আমি এই প্রশ্নে এসেছি, সুতরাং আমার কোডটি যদি কারও সাহায্য করে তবে আমি তা ভাগ করি। একটি মাত্র স্তরের গভীরতা এবং সম্ভাব্য খালি মানগুলির সাথে স্ট্রিংয়ের জন্য কাজ করে (তবে শূন্য নয়), যেমন:

"{ :key_a => 'value_a', :key_b => 'value_b', :key_c => '' }"

কোডটি হ'ল:

the_string = '...'
the_hash = Hash.new
the_string[1..-2].split(/, /).each {|entry| entryMap=entry.split(/=>/); value_str = entryMap[1]; the_hash[entryMap[0].strip[1..-1].to_sym] = value_str.nil? ? "" : value_str.strip[1..-2]}

0

একই জাতীয় ইস্যুতে দৌড়ে যা ইওল () ব্যবহারের প্রয়োজন।

আমার পরিস্থিতি, আমি একটি এপিআই থেকে কিছু ডেটা টানছিলাম এবং স্থানীয়ভাবে কোনও ফাইলে লিখছিলাম। তারপরে ফাইলটি থেকে ডেটা টানতে সক্ষম হ্যাশ ব্যবহার করুন।

আমি ভেরিয়েবলের মধ্যে ফাইলের বিষয়বস্তু পড়তে IO.read () ব্যবহার করেছি। এই ক্ষেত্রে আইও.ড্রেড () এটিকে স্ট্রিং হিসাবে তৈরি করে।

তারপরে eval () ব্যবহার করে স্ট্রিংটিকে হ্যাশে রূপান্তর করতে।

read_handler = IO.read("Path/To/File.json")

puts read_handler.kind_of?(String) # Returns TRUE

a = eval(read_handler)

puts a.kind_of?(Hash) # Returns TRUE

puts a["Enter Hash Here"] # Returns Key => Values

puts a["Enter Hash Here"].length # Returns number of key value pairs

puts a["Enter Hash Here"]["Enter Key Here"] # Returns associated value

এছাড়াও কেবল উল্লেখ করতে হবে যে আইও ফাইলের পূর্বপুরুষ। সুতরাং আপনি চাইলে পরিবর্তে ফাইল.ড্রেডও ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.