Hasilkan string JSON dari NSDictionary di iOS

338

Saya punya dictionarysaya harus menghasilkan JSON stringdengan menggunakan dictionary. Apakah mungkin untuk mengubahnya? Bisakah kalian bantu dalam hal ini?

ChandraSekhar
sumber
3
@RicardoRivaldo begini
QED
18
siapa pun yang datang ke sini dari pencarian google, silakan baca jawaban di bawah ini oleh @Guillaume
Mahendra Liya

Jawaban:

233

Berikut adalah kategori untuk NSArray dan NSDictionary untuk membuat ini sangat mudah. Saya telah menambahkan opsi untuk mencetak-cantik (baris baru dan tab agar lebih mudah dibaca).

@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
Ben Clayton
sumber
8
jika kita membuat kategori NSObject dan menggunakan metode yang sama, ia berfungsi untuk NSArray dan NSDictionary. Tidak perlu menulis dua file / antarmuka terpisah. Dan itu harus mengembalikan nol jika terjadi kesalahan.
Abdullah Umer
Mengapa Anda menganggap itu NSUTF8StringEncodingadalah pengkodean yang benar?
Perbatasan Heath
5
Nevermind, dokumentasi mengatakan "Data yang dihasilkan dikodekan dalam UTF-8."
Perbatasan Heath
@AbdullahUmer Itu ini apa yang saya lakukan juga karena saya kira itu juga akan bekerja pada NSNumber, NSString, dan NSNull- akan mencari tahu dalam satu atau dua menit!
Benjohn
756

Apple menambahkan parser dan serializer JSON di iOS 5.0 dan Mac OS X 10.7. Lihat NSJSONSerialisasi .

Untuk menghasilkan string JSON dari NSDictionary atau NSArray, Anda tidak perlu mengimpor kerangka kerja pihak ketiga lagi.

Inilah cara melakukannya:

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];
}
Guillaume
sumber
88
Ini saran yang bagus ... sungguh menyebalkan memiliki proyek yang memiliki banyak perpustakaan pihak ketiga.
zakdances
3
Solusi hebat untuk mengonversi objek JSON. Kerja bagus .. :)
MS.
1
+1 Menambahkan ini sebagai kategori NSArraydan NSDictionaryakan membuatnya lebih mudah menggunakannya kembali.
devios1
bagaimana cara mengubah json kembali ke kamus?
OMGPOP
5
@OMGPOP - [NSJSONSerialization JSONObjectWithData:options:error:]mengembalikan object Foundation dari data JSON yang diberikan
Lukasz 'Severiaan' Grela
61

Untuk mengonversi NSDictionary ke NSString:

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

CATATAN: Jawaban ini diberikan sebelum iOS 5 dirilis.

Dapatkan json-framework dan lakukan ini:

#import "SBJsonWriter.h"

...

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

NSString *jsonString = [jsonWriter stringWithObject:myDictionary];  

[jsonWriter release];

myDictionary akan menjadi kamus Anda.

Nick Weaver
sumber
Terimakasih atas tanggapan Anda. Bisakah Anda menyarankan saya cara menambahkan kerangka kerja ke aplikasi saya, sepertinya ada begitu banyak folder di stig-json-framework-36b738f
ChandraSekhar
@ChandraSekhar setelah mengkloning repositori git, sudah cukup untuk menambahkan Kelas / folder ke proyek Anda.
Nick Weaver
1
Saya baru saja menulis stackoverflow.com/questions/11765037/… untuk menggambarkan hal ini sepenuhnya. Termasuk pengecekan kesalahan dan beberapa saran.
Pascal
25

Anda juga dapat melakukan ini sambil jalan dengan memasukkan yang berikut ke dalam debugger

po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4];
Andy
sumber
4
Konstanta kode keras agak menakutkan. Mengapa tidak menggunakan NSUTF8StringEncoding dll.?
Ian Newson
5
Itu saat ini tidak berfungsi di LLDB:error: use of undeclared identifier 'NSUTF8StringEncoding'
Andy
2
Sempurna untuk saat-saat di mana Anda ingin segera memeriksa kamus dengan editor json eksternal!
Florian
15

Anda dapat melewati larik atau kamus. Di sini, saya mengambil NSMutableDictionary.

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

Untuk menghasilkan string JSON dari NSDictionary atau NSArray, Anda tidak perlu mengimpor kerangka kerja pihak ketiga. Cukup gunakan kode berikut: -

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);
Temui Doshi
sumber
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];
pengguna2885077
sumber
Ketika saya meneruskan ini ke permintaan POST sebagai parameter, saya menerima +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'kesalahan. Menggunakan XCode 9.0
Daya Kevin
7

Dalam Swift (versi 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
}
Raja-Penyihir
sumber
3

Sekarang tidak perlu kelas pihak ketiga ios 5 memperkenalkan Nsjsonserialization

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

kode ini dapat bermanfaat untuk mendapatkan jsondata.

mahesh chowdary
sumber
Saya pikir itu NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers.
afp
1

Di Swift, saya telah membuat fungsi pembantu berikut:

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)")
    }
}
James Laurenstin
sumber
1

Pada ISO7 setidaknya Anda dapat dengan mudah melakukan ini dengan NSJSONSerialization .

Astaga
sumber
ini sebenarnya tersedia pada iOS 5.0, bukan 7.0, menurut tautan.
manroe
1

Berikut adalah Swift 4 versi

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

}

Contoh Penggunaan

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

Atau jika Anda yakin itu adalah kamus yang valid maka Anda dapat menggunakannya

let jsonString = try? dic.toString()
levin varghese
sumber
Ini tidak akan melakukan seperti pertanyaan yang diminta, prettyPrint mempertahankan spasi ketika mencoba untuk masuk ke string.
Sean Lintern
1

Ini akan bekerja di swift4 dan 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)
azeem usmani
sumber
-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)
        }
    }
}

Yang ini cukup dekat dengan gaya cetak Objective-C asli

markov
sumber