আইওএসে এনএসডেটরিয় থেকে জেএসএন স্ট্রিং তৈরি করুন


338

আমার একটি ব্যবহার করে dictionaryজেনারেট করা দরকার । এটি কি রূপান্তর করা সম্ভব? আপনি দয়া করে এই সাহায্য করতে পারেন?JSON stringdictionary


3
@RicardoRivaldo যে এই
Qed

18
গুগল অনুসন্ধান থেকে যে কেউ এখানে আসছেন, দয়া করে নীচের উত্তরটি পড়ুন @ গুইলিউমে
মহেন্দ্র লিয়া

উত্তর:


233

এই অতি-সহজ করে তোলার জন্য এখানে এনএসআরারি এবং এনএসডি অভিধানের বিভাগ রয়েছে। আমি প্রিটি-প্রিন্টের জন্য একটি বিকল্প যুক্ত করেছি (পড়ার সহজ করার জন্য নিউলাইনস এবং ট্যাবগুলি)।

@interface NSDictionary (BVJSONString)
-(NSString*) bv_jsonStringWithPrettyPrint:(BOOL) prettyPrint;
@end

@implementation NSDictionary (BVJSONString)

  -(NSString*) bv_jsonStringWithPrettyPrint:(BOOL) prettyPrint {
     NSError *error;
     NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self
                                                   options:(NSJSONWritingOptions)    (prettyPrint ? NSJSONWritingPrettyPrinted : 0)
                                                     error:&error];

     if (! jsonData) {
        NSLog(@"%s: error: %@", __func__, error.localizedDescription);
        return @"{}";
     } else {
        return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
     } 
 }
@end

@interface NSArray (BVJSONString)
- (NSString *)bv_jsonStringWithPrettyPrint:(BOOL)prettyPrint;
@end

@implementation NSArray (BVJSONString)
-(NSString*) bv_jsonStringWithPrettyPrint:(BOOL) prettyPrint {
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self
                                                       options:(NSJSONWritingOptions) (prettyPrint ? NSJSONWritingPrettyPrinted : 0)
                                                         error:&error];

    if (! jsonData) {
        NSLog(@"%s: error: %@", __func__, error.localizedDescription);
        return @"[]";
    } else {
        return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
}
@end

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

আপনি কেন NSUTF8StringEncodingএটি সঠিক এনকোডিং বলে ধরে নিচ্ছেন?
সীমানা

5
কিছু নয়, ডকুমেন্টেশনটি বলে "ফলস্বরূপ তথ্যটি ইউটিএফ -8 এ একটি এনকোডড।"
সীমানা

যে কি আমি খুব কাজ করেছি আমি অনুমান এটি উপর কাজ করব @AbdullahUmer NSNumber, NSStringএবং NSNullএক বা দুই মিনিটে খুঁজে বের করতে হবে -
বেনজোহান

756

অ্যাপল আইওএস 5.0 এবং ম্যাক ওএস এক্স 10.7 এ একটি জেএসএন পার্সার এবং সিরিয়ালাইজার যুক্ত করেছে। এনএসজেএসএসনারাইজেশন দেখুন ।

এনএসডিকোরি বা এনএসআরে থেকে জেএসএন স্ট্রিং তৈরি করতে আপনার আর কোনও তৃতীয় পক্ষের কাঠামো আমদানি করতে হবে না।

কিভাবে করতে হবে এখানে আছে:

NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionaryOrArrayToOutput 
                                                   options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                     error:&error];

if (! jsonData) {
    NSLog(@"Got an error: %@", error);
} else {
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

88
এটি একটি ভাল পরামর্শ ... প্রকল্পগুলি তৃতীয় পক্ষের লাইব্রেরিগুলির একটি টানা থাকা সত্যিই বিরক্তিকর।
জাকদানস

3
JSON অবজেক্টে রূপান্তর করার জন্য দুর্দান্ত সমাধান। দুর্দান্ত কাজ .. :)
এমএস।

1
+1 এটিকে বিভাগ হিসাবে যুক্ত করা NSArrayএবং NSDictionaryএটি পুনরায় ব্যবহার করা আরও সহজ।
ডিভাইস 1

কীভাবে জসনকে অভিধানে ফিরিয়ে আনবেন?
ওএমজিপিওপ

5
@OMGPOP - [NSJSONSerialization JSONObjectWithData:options:error:]প্রদত্ত JSON তথ্য থেকে আয় একটি ফাউন্ডেশন objec
Lukasz 'Severiaan' Grela

61

একটি এনএসডি অভিধানকে একটি এনএসএস স্ট্রিংয়ে রূপান্তর করতে:

NSError * err;
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:myDictionary options:0 error:&err]; 
NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

34

দ্রষ্টব্য: আইওএস 5 প্রকাশের আগে এই উত্তর দেওয়া হয়েছিল।

জসন-ফ্রেমওয়ার্ক পান এবং এটি করুন:

#import "SBJsonWriter.h"

...

SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init];

NSString *jsonString = [jsonWriter stringWithObject:myDictionary];  

[jsonWriter release];

myDictionary আপনার অভিধান হবে।


আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. আপনি কীভাবে আমার অ্যাপ্লিকেশনটিতে কাঠামো যুক্ত করবেন তা আমাকে পরামর্শ দিতে পারেন, মনে হচ্ছে স্টিগ-জসন-ফ্রেমওয়ার্ক -৩b বি 8৩৮ এ-তে অনেকগুলি ফোল্ডার রয়েছে
চন্দ্রশেখর

@ চন্দ্রশেখর গিট সংগ্রহস্থলটি ক্লোন করার পরে আপনার প্রকল্পে ক্লাস / ফোল্ডার যুক্ত করা যথেষ্ট।
নিক ওয়েইवर

1
এটিকে পুরোপুরি চিত্রিত করার জন্য আমি কেবল স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / ১১505050০37/// লিখেছি । ত্রুটি পরীক্ষা এবং উপদেশের কিছু টুকরো অন্তর্ভুক্ত করুন।
পাস্কাল

25

নিম্নলিখিতটি ডিবাগারে প্রবেশ করে আপনি অন-ফ্লাইতেও এটি করতে পারেন

po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4];

4
হার্ড কোডেড ধ্রুবকগুলি কিছুটা ভীতিজনক। এনএসইউটিএফ 8 স্ট্রিংএকনডিং ইত্যাদি ব্যবহার করবেন না কেন?
ইয়ান নিউজন

5
এটি বর্তমানে এলএলডিবিতে কাজ করে না:error: use of undeclared identifier 'NSUTF8StringEncoding'
অ্যান্ডি

2
সেই মুহুর্তগুলির জন্য উপযুক্ত যেখানে আপনি খুব দ্রুত কোনও বাহ্যিক জসন সম্পাদক সহ একটি অভিধান তদন্ত করতে চান!
ফ্লোরিয়ান

15

আপনি অ্যারে বা অভিধান পাস করতে পারেন। এখানে, আমি এনএসমিটেবল ডিকোশনারি নিচ্ছি।

NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init];
[contentDictionary setValue:@"a" forKey:@"b"];
[contentDictionary setValue:@"c" forKey:@"d"];

এনএসডিকোরি বা এনএসআরে থেকে জেএসএন স্ট্রিং তৈরি করতে আপনার কোনও তৃতীয় পক্ষের কাঠামো আমদানি করতে হবে না। শুধু নিম্নলিখিত কোড ব্যবহার করুন:

NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:contentDictionary // Here you can pass array or dictionary
                    options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                    error:&error];
NSString *jsonString;
if (jsonData) {
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    //This is your JSON String
    //NSUTF8StringEncoding encodes special characters using an escaping scheme
} else {
    NSLog(@"Got an error: %@", error);
    jsonString = @"";
}
NSLog(@"Your JSON String is %@", jsonString);

12
NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init];
        [contentDictionary setValue:@"a" forKey:@"b"];
        [contentDictionary setValue:@"c" forKey:@"d"];
        NSData *data = [NSJSONSerialization dataWithJSONObject:contentDictionary options:NSJSONWritingPrettyPrinted error:nil];
        NSString *jsonStr = [[NSString alloc] initWithData:data
                                                  encoding:NSUTF8StringEncoding];

আমি যখন প্যারামিটার হিসাবে এটি পোস্টের অনুরোধে পাস করি তখন আমি +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'ত্রুটি পাচ্ছি । এক্সকোড 9.0
দয়া কেভিন

7

ইন সুইফট (সংস্করণ 2.0) :

class func jsonStringWithJSONObject(jsonObject: AnyObject) throws -> String? {
    let data: NSData? = try? NSJSONSerialization.dataWithJSONObject(jsonObject, options: NSJSONWritingOptions.PrettyPrinted)

    var jsonStr: String?
    if data != nil {
        jsonStr = String(data: data!, encoding: NSUTF8StringEncoding)
    }

    return jsonStr
}

3

এখন কোনও তৃতীয় পক্ষের ক্লাসের দরকার নেই আইওএস 5 চালু করা এনএসজেসনসিরিয়ালাইজেশন

NSString *urlString=@"Your url";
NSString *urlUTF8 = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[[NSURL alloc]initWithString:urlUTF8];
NSURLRequest *request=[NSURLRequest requestWithURL:url];

NSURLResponse *response;

NSData *GETReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

NSError *myError = nil;

NSDictionary *res = [NSJSONSerialization JSONObjectWithData:GETReply options:NSJSONReadingMutableLeaves|| NSJSONReadingMutableContainers error:&myError];

Nslog(@"%@",res);

এই কোডটি jsondata পাওয়ার জন্য দরকারী হতে পারে।


আমি মনে করি এটি NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers
এএফপি

1

সুইফটে, আমি নিম্নলিখিত সহায়ক ফাংশনটি তৈরি করেছি:

class func nsobjectToJSON(swiftObject: NSObject) {
    var jsonCreationError: NSError?
    let jsonData: NSData = NSJSONSerialization.dataWithJSONObject(swiftObject, options: NSJSONWritingOptions.PrettyPrinted, error: &jsonCreationError)!

    if jsonCreationError != nil {
        println("Errors: \(jsonCreationError)")
    }
    else {
        // everything is fine and we have our json stored as an NSData object. We can convert into NSString
        let strJSON : NSString =  NSString(data: jsonData, encoding: NSUTF8StringEncoding)!
        println("\(strJSON)")
    }
}


1

এখানে সুইফট 4 সংস্করণ রয়েছে

extension NSDictionary{

func toString() throws -> String? {
    do {
        let data = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted)
        return String(data: data, encoding: .utf8)
    }
    catch (let error){
        throw error
    }
}

}

ব্যবহারের উদাহরণ

do{
    let jsonString = try dic.toString()
    }
    catch( let error){
        print(error.localizedDescription)
    }

অথবা আপনি যদি নিশ্চিত হন যে এটি বৈধ অভিধান তবে আপনি ব্যবহার করতে পারেন

let jsonString = try? dic.toString()

এটি অনুরোধ করা প্রশ্নের মতো সঞ্চালন করবে না, স্ট্রিনে স্কোয়াশ করার চেষ্টা করার সময় প্রিন্টিপ্রিন্ট ফাঁকা স্থান ধরে রাখে।
শান লটার্ন

1

এটি swift4 এবং swift5 এ কাজ করবে।

let dataDict = "the dictionary you want to convert in jsonString" 

let jsonData = try! JSONSerialization.data(withJSONObject: dataDict, options: JSONSerialization.WritingOptions.prettyPrinted)

let jsonString = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)! as String

print(jsonString)

-1
public func jsonPrint(_ o: NSObject, spacing: String = "", after: String = "", before: String = "") {
    let newSpacing = spacing + "    "
    if o.isArray() {
        print(before + "[")
        if let a = o as? Array<NSObject> {
            for object in a {
                jsonPrint(object, spacing: newSpacing, after: object == a.last! ? "" : ",", before: newSpacing)
            }
        }
        print(spacing + "]" + after)
    } else {
        if o.isDictionary() {
            print(before + "{")
            if let a = o as? Dictionary<NSObject, NSObject> {
                for (key, val) in a {
                    jsonPrint(val, spacing: newSpacing, after: ",", before: newSpacing + key.description + " = ")
                }
            }
            print(spacing + "}" + after)
        } else {
            print(before + o.description + after)
        }
    }
}

এটি মূল আসল উদ্দেশ্য-সি প্রিন্ট শৈলীর খুব কাছে

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