आईओएस में एनएसएएनआर से जेन्सन स्ट्रिंग उत्पन्न करें


338

मुझे उपयोग करके dictionaryउत्पन्न करने की आवश्यकता है । क्या इसे परिवर्तित करना संभव है? क्या आप लोग इस पर मदद कर सकते हैं?JSON stringdictionary


3
@RicardoRivaldo यह है
QED

18
किसी को भी गूगल खोज से यहाँ आने के लिए, कृपया के माध्यम से जवाब नीचे @Guillaume द्वारा पढ़ा
महेंद्र लिया

जवाबों:


233

इस सुपर-आसान बनाने के लिए NSArray और NSDictionary के लिए श्रेणियां हैं। मैंने सुंदर-प्रिंट के लिए एक विकल्प जोड़ा है (नए सिरे से और पढ़ने में आसान बनाने के लिए टैब)।

@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
अगर हम NSObject की श्रेणी बनाते हैं और एक ही विधि रखते हैं, तो यह NSArray और NSDictionary दोनों के लिए काम करता है। दो अलग-अलग फ़ाइलों / इंटरफेस को लिखने की आवश्यकता नहीं है। और यह त्रुटि के मामले में शून्य लौटना चाहिए।
अब्दुल्ला उमेर

आप क्यों मानते हैं कि NSUTF8StringEncodingसही एन्कोडिंग है?
हीथ बॉर्डर्स

5
कोई बात नहीं, दस्तावेज़ कहता है "परिणामी डेटा UTF-8 में एक एन्कोडेड है।"
हीथ बॉर्डर्स

यही कारण है कि क्या मैं भी किया है के रूप में मुझे लगता है कि यह भी पर काम करेंगे @AbdullahUmer NSNumber, NSStringऔर NSNullएक या दो मिनट में पता चलेगा -
बेंजो

756

Apple ने iOS 5.0 और Mac OS X 10.7 में एक JSON पार्सर और धारावाहिक जोड़ा। NSJSONSerialization देखें ।

एक NSSON या NSArray से JSON स्ट्रिंग उत्पन्न करने के लिए, आपको अब किसी तीसरे पक्ष के ढांचे को आयात करने की आवश्यकता नहीं है।

यहां है कि इसे कैसे करना है:

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
यह अच्छी सलाह है ... परियोजनाओं को तीसरे पक्ष के पुस्तकालयों का एक टन होना वास्तव में कष्टप्रद है।
zakdances

3
JSON ऑब्जेक्ट में कनवर्ट करने के लिए शानदार समाधान। महान काम .. :)
एमएस।

1
+1 इसे एक श्रेणी के रूप में जोड़ना NSArrayऔर NSDictionaryइसे बहुत सरल बनाना होगा।
devios1

कैसे वापस शब्दकोष में परिवर्तित करने के लिए?
OMGPOP

5
@OMGPOP - [NSJSONSerialization JSONObjectWithData:options:error:]दिए गए JSON डेटा से एक फाउंडेशन objec लौटाता है
लुकाज़ 'सेवेरियन' ग्रीला

61

एनएसएसट्रेड को एनएसएसट्रिंग में बदलने के लिए:

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

34

नोट: यह जवाब iOS 5 जारी होने से पहले दिया गया था।

Json- फ्रेमवर्क प्राप्त करें और यह करें:

#import "SBJsonWriter.h"

...

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

NSString *jsonString = [jsonWriter stringWithObject:myDictionary];  

[jsonWriter release];

myDictionary आपका शब्दकोश होगा


आपके प्रतिक्रिया के लिए धन्येवाद। क्या आप कृपया मुझे सुझाव दे सकते हैं कि मेरे आवेदन में फ्रेमवर्क कैसे जोड़ा जाए, ऐसा लगता है कि स्टिग-ज्सन-फ्रेमवर्क -36 बी 738 एफ में बहुत सारे फ़ोल्डर हैं
चंद्रशेखर

@ गणधरसेठ जीआईटी रिपॉजिटरी को क्लोन करने के बाद, यह आपके प्रोजेक्ट में क्लासेस / फ़ोल्डर को जोड़ने के लिए पर्याप्त होना चाहिए।
निक वीवर

1
मैंने इसे पूरी तरह से समझाने के लिए सिर्फ stackoverflow.com/questions/11765037/… लिखा है । त्रुटि जाँच और सलाह के कुछ टुकड़े शामिल करें।
पास्कल

25

आप इसे डिबगर में निम्न दर्ज करके भी कर सकते हैं

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

4
हार्ड कोडेड कॉन्स्टेंट थोड़े डरावने होते हैं। NSUTF8StringEncoding आदि का उपयोग क्यों नहीं किया जाता है?
इयान न्यूजन

5
यह वर्तमान में एलएलडीबी में काम नहीं करता है:error: use of undeclared identifier 'NSUTF8StringEncoding'
एंडी

2
उन क्षणों के लिए बिल्कुल सही है जहाँ आप जल्दी से एक बाहरी json संपादक के साथ एक शब्दकोश का निरीक्षण करना चाहते हैं!
फ्लोरियन

15

आप ऐरे या डिक्शनरी पास कर सकते हैं। यहाँ, मैं NSMutableDictionary ले रहा हूँ।

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

एक NSSON या NSArray से JSON स्ट्रिंग उत्पन्न करने के लिए, आपको किसी तीसरे पक्ष के ढांचे को आयात करने की आवश्यकता नहीं है। बस निम्नलिखित कोड का उपयोग करें: -

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'त्रुटि को दूर कर रहा हूं । XCode 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

अब किसी तीसरे पक्ष के वर्ग की आवश्यकता नहीं है IOS 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

ISO7 के रूप में कम से कम आप आसानी से NSJSONSerialization के साथ ऐसा कर सकते हैं ।


यह वास्तव में iOS 5.0 के रूप में उपलब्ध है, लिंक के अनुसार 7.0 नहीं।
मैनरो

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

यह स्विफ्ट 4 और स्विफ्ट 5 में काम करेगा।

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)
        }
    }
}

यह मूल उद्देश्य-सी प्रिंट शैली के बहुत करीब है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.