আমি কীভাবে কোনও জেএসএন স্ট্রিংটিকে এনএসডি অভিধানে ডিসরিয়ালাইজ করব? (আইওএস 5+ এর জন্য)


154

আমার আইওএস 5 অ্যাপে আমার কাছে NSStringএকটি জেএসএন স্ট্রিং রয়েছে। আমি JSON স্ট্রিং প্রতিনিধিত্ব একটি নেটিভ NSDictionaryঅবজেক্ট মধ্যে deserialize করতে চাই ।

 "{\"password\" : \"1234\",  \"user\" : \"andreas\"}"

আমি নিম্নলিখিত পদ্ধতির চেষ্টা করেছি:

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:@"{\"2\":\"3\"}"
                                options:NSJSONReadingMutableContainers
                                  error:&e];  

তবে এটি রানটাইম ত্রুটি ছুড়ে দেয়। আমি কি ভুল করছি?

-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c'

এটি ছিল আমার দৃষ্টিভঙ্গি: এনএসডেটরিয় * জেএসওন = [এনএসজেএসএসনারাইজেশন জেএসওনঅজেক্টবিথডাটা: @ "{\" 2 \ ": 3" 3 \ "}" বিকল্পগুলি: এনএসজেএসনরাইডিং মিউটেবল কনটেনার ত্রুটি: & e]; আমি পেয়েছি: 2011-12-22 17: 18: 59.300 পাই9000 [938: 13803] - [__ এনএসসিএফসি স্ট্যান্ট্রিং স্ট্রিট বাইটস]: অজ্ঞাত নির্বাচনকারী নির্বাচক 0x1372c 2011-12-22 17: 18: 59.302 পাই9000 [938: 13803] *** পাঠানো হয়েছে অপ্রত্যাশিত ব্যতিক্রম 'এনএসআইএনওডিয়ালআরগিউমেন্টএক্সেপশন' এর কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে, কারণ: '- [__ NSCFConstantString বাইটস]: অজানা নির্বাচক 0x1372c উদাহরণ পাঠিয়েছে'
Andreas

উত্তর:


335

দেখে মনে হচ্ছে আপনি কোনও NSStringপরামিতিটি অতিক্রম করছেন যেখানে আপনার NSDataপরামিতিটি পাস করা উচিত :

NSError *jsonError;
NSData *objectData = [@"{\"2\":\"3\"}" dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData
                                      options:NSJSONReadingMutableContainers 
                                        error:&jsonError];

@ অ্যাবিজেম, আমি এখানে কোন ত্রুটি ব্যবহার করতে পারি? (ওপ এটি উল্লেখ করে না)

ধন্যবাদ ... এই সাহায্য করেছে! এবং +1
জয়প্রকাশ দুবে 27'14

ধন্যবাদ, এটি কাজ করেছে। তবে এক্সকোড 5 এর nilপরিবর্তে ত্রুটি হিসাবে ব্যবহার করা হচ্ছে&e
মাইকেল হো চাম

3
আমি অবজেক্টিভ সিটি পছন্দ করি আপনার স্ট্রিংটিকে কাঁচা বাইটে এনকোড করুন এবং তারপরে এগুলি এনএসএসআরটিংস এবং এনএসএন নাম্বারে ডিকোড করুন। এটা সুস্পষ্ট, তাই না?
vahotm

1
আপনার আবেদনের বাইরে কোথাও থেকে স্ট্রিং হিসাবে জেএসএনকে পাওয়া আবিজার্নকে সাধারণ বিষয়
চিকোভিটজ

37
NSData *data = [strChangetoJSON dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data
                                                             options:kNilOptions
                                                               error:&error];

উদাহরণস্বরূপ আপনার strChangetoJSON এ একটি NSStringবিশেষ অক্ষর রয়েছে NSString। তারপরে আপনি উপরের কোডটি ব্যবহার করে সেই স্ট্রিংটিকে JSON প্রতিক্রিয়াতে রূপান্তর করতে পারেন।


6

আমি @ অ্যাজাইজার উত্তর থেকে একটি বিভাগ তৈরি করেছি

@implementation NSString (Extensions)
- (NSDictionary *) json_StringToDictionary {
    NSError *error;
    NSData *objectData = [self dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error];
    return (!json ? nil : json);
}
@end

এটি এর মতো ব্যবহার করুন,

NSString *jsonString = @"{\"2\":\"3\"}";
NSLog(@"%@",[jsonString json_StringToDictionary]);

এটি আমার বোধগম্য যে errorএই ক্ষেত্রে পরীক্ষা না করা সবচেয়ে ভাল অনুশীলন , তবে তার পরিবর্তে ফেরতের মান শূন্য হয় কিনা তা পরীক্ষা করা। অর্থাত return json ?: nil; মাইনর nitpick কিন্তু মূল্য উল্লেখ, আমি মনে করি।
মাইক 17

@ মাইক, আমি মনে করি মান নির্বিশেষে "ত্রুটি" পরীক্ষা করা ঠিক আছে? কারণ, যদি কোনও ত্রুটি থাকে তবে আমরা এখনই ফিরে যাচ্ছি nil
হেমং

অ্যাপলের ডক্স অনুসারে "রেফারেন্স দিয়ে পাস করা ত্রুটিগুলি মোকাবেলা করার সময়, উপরে উল্লিখিত হিসাবে কোনও ত্রুটি ঘটেছে কিনা তা জানতে পদ্ধতির রিটার্ন মানটি পরীক্ষা করা গুরুত্বপূর্ণ। ত্রুটি নির্দেশকটি নির্দেশিত হয়েছে কিনা তা পরীক্ষা করার জন্য কেবল পরীক্ষা করবেন না একটি ভুল." বিকাশকারী.অ্যাপল .com/লিবারি / আইওস / ডকুমেন্টেশন / কোকোয়া / কনসেপ্টুয়াল / আমি বিশ্বাস করি এটি কারণ এমন কোনও সমস্যা হতে পারে যেখানে কোনও ত্রুটি ঘটে না এবং পদ্ধতিটি কোনও মান দেয়, তবে স্মৃতি যেখানে ত্রুটি পয়েন্টারটি নির্দেশ করে লিখিত, যাতে আপনি ভুল করে মনে করেন যে একটি ত্রুটি রয়েছে exists
মাইক 18

আমার পূর্বের একটি প্রশ্নে আমাকে ছড়িয়ে দেওয়া হয়েছিল: "পরিবর্তনশীলটি অবিচ্ছিন্ন করা হয়েছে That এর অর্থ এই ঠিকানার মানটি অপরিজ্ঞাত, সুতরাং মান পরিবর্তন করা কোনও অর্থ বোঝাতে পারে না ... যেহেতু কোনও গ্যারান্টি নেই যে পদ্ধতিটি লিখবে না অ্যাড্রেসের আবর্জনা যদি কোনও ত্রুটি না ঘটে তবে অ্যাপলের ডক্স বলে যে ত্রুটি ভেরিয়েবলের মান পরীক্ষা করা নিরাপদ নয় "" stackoverflow.com/questions/25558442/…
মাইক 18

1
@ মাইক, ওহ দুর্দান্ত, জানা ভাল! রেফারেন্সের জন্য ধন্যবাদ। আমি শীঘ্রই এটি আপডেট করব।
হেমং

5

সুইফট 3 এবং সুইফট 4 এর Stringসাথে একটি পদ্ধতি বলা হয় data(using:allowLossyConversion:)data(using:allowLossyConversion:)নিম্নলিখিত ঘোষণা আছে:

func data(using encoding: String.Encoding, allowLossyConversion: Bool = default) -> Data?

প্রদত্ত এনকোডিং ব্যবহার করে স্ট্রিং এনকোডযুক্ত একটি উপস্থাপনাযুক্ত একটি ডেটা ফেরত দেয়।

সুইফট 4 String-এর data(using:allowLossyConversion:)সাথে একটি অভিধানে জেএসএন স্ট্রিংকে ডিসিশায়াল করার জন্য JSONDecoderএর ব্যবহারের সাথে ব্যবহার করা যেতে পারে decode(_:from:)

তদ্ব্যতীত, সুইফট 3 এবং সুইফট 4 Stringএর data(using:allowLossyConversion:)সাথে একটি অভিধানে জেএসএন স্ট্রিংকে ডিসিশিয়ালাইজ করার জন্য JSONSerializationএর ব্যবহারের সাথেও ব্যবহার করা যেতে পারে json​Object(with:​options:​)


# 1। সুইফট 4 সমাধান

সুইফট 4 এর সাথে JSONDecoderএকটি পদ্ধতি বলা হয় decode(_:from:)decode(_:from:)নিম্নলিখিত ঘোষণা আছে:

func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable

প্রদত্ত JSON উপস্থাপনা থেকে প্রদত্ত ধরণের একটি শীর্ষ স্তরের মান ডিকোড করে।

কিভাবে ব্যবহার করতে শো নিচে খেলার মাঠ কোড data(using:allowLossyConversion:)এবং decode(_:from:)অনুক্রমে একটি পেতে Dictionaryএকটি JSON- থেকে ফরম্যাট String:

let jsonString = """
{"password" : "1234",  "user" : "andreas"}
"""

if let data = jsonString.data(using: String.Encoding.utf8) {
    do {
        let decoder = JSONDecoder()
        let jsonDictionary = try decoder.decode(Dictionary<String, String>.self, from: data)
        print(jsonDictionary) // prints: ["user": "andreas", "password": "1234"]
    } catch {
        // Handle error
        print(error)
    }
}

# 2। সুইফট 3 এবং সুইফট 4 সমাধান

সুইফট 3 এবং সুইফট 4 এর JSONSerializationসাথে একটি পদ্ধতি বলা হয় json​Object(with:​options:​)json​Object(with:​options:​)নিম্নলিখিত ঘোষণা আছে:

class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any

প্রদত্ত JSON ডেটা থেকে একটি ফাউন্ডেশন অবজেক্ট প্রদান করে।

কিভাবে ব্যবহার করতে শো নিচে খেলার মাঠ কোড data(using:allowLossyConversion:)এবং json​Object(with:​options:​)অনুক্রমে একটি পেতে Dictionaryএকটি JSON- থেকে ফরম্যাট String:

import Foundation

let jsonString = "{\"password\" : \"1234\",  \"user\" : \"andreas\"}"

if let data = jsonString.data(using: String.Encoding.utf8) {
    do {
        let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String : String]
        print(String(describing: jsonDictionary)) // prints: Optional(["user": "andreas", "password": "1234"])
    } catch {
        // Handle error
        print(error)
    }
}

3

সুইফট ২.২ এর জন্য অ্যাবিজার্ন কোড ব্যবহার করা

let objectData = responseString!.dataUsingEncoding(NSUTF8StringEncoding)
let json = try NSJSONSerialization.JSONObjectWithData(objectData!, options: NSJSONReadingOptions.MutableContainers)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.