iOS의 NSDictionary에서 JSON 문자열 생성


338

나는이 dictionary를 생성하는 I 필요 JSON string사용을 dictionary. 그것을 변환 할 수 있습니까? 도와 주실 래요?


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 모두에서 작동합니다. 별도의 파일 / 인터페이스를 작성할 필요가 없습니다. 그리고 오류가 발생하면 nil을 반환해야합니다.
압둘라 우 메르

NSUTF8StringEncoding이것이 올바른 인코딩 이라고 가정 합니까?
히스 국경

5
설명서에 "결과 데이터는 UTF-8로 인코딩되어 있습니다."
히스 국경

나는 그것이 또한 작업 할 수 있습니다 가정으로 나도 무슨 짓을했는지 그의 @AbdullahUmer NSNumber, NSString그리고 NSNull2 분에서 찾을 수 있습니다 -!
Benjohn

756

Apple은 iOS 5.0 및 Mac OS X 10.7에서 JSON 파서 및 시리얼 라이저를 추가했습니다. NSJSONSerialization을 참조하십시오 .

NSDictionary 또는 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
이것은 좋은 조언입니다 ... 프로젝트에 많은 제 3 자 라이브러리가있는 것은 정말 짜증납니다.
zakdances

3
JSON 객체로 변환하기위한 최상의 솔루션. 대단한 일 .. :)
MS.

1
+1에 대한 범주로이 추가 NSArrayNSDictionary훨씬 간단하게 재사용 할 것.
devios1

JSON을 다시 사전으로 변환하는 방법?
OMGPOP

5
@OMGPOP- [NSJSONSerialization JSONObjectWithData:options:error:]주어진 JSON 데이터에서 기초 객체를 반환합니다
Lukasz 'Severiaan'Grela

61

NSDictionary를 NSString으로 변환하려면

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

34

참고 :이 답변은 iOS 5가 출시되기 전에 제공되었습니다.

json-framework를 얻고 이것을하십시오 :

#import "SBJsonWriter.h"

...

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

NSString *jsonString = [jsonWriter stringWithObject:myDictionary];  

[jsonWriter release];

myDictionary 사전이 될 것입니다.


답변 주셔서 감사합니다. stig-json-framework-36b738f에 너무 많은 폴더가있는 것처럼 보입니다.
ChandraSekhar

git 저장소를 복제 한 후 @ChandraSekhar는 Classes / 폴더를 프로젝트에 추가하는 것으로 충분합니다.
Nick Weaver

1
나는 이것을 완전히 설명하기 위해 stackoverflow.com/questions/11765037/… 을 썼습니다 . 오류 점검 및 조언을 포함하십시오.
Pascal

25

디버거에 다음을 입력하여이 작업을 즉시 수행 할 수도 있습니다.

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

4
하드 코딩 된 상수는 약간 무섭습니다. NSUTF8StringEncoding 등을 사용하지 않는 이유는 무엇입니까?
이안 뉴슨

5
LLDB에서는 현재 작동하지 않습니다 :error: use of undeclared identifier 'NSUTF8StringEncoding'
Andy

2
외부 json 편집기로 사전을 신속하게 검사하려는 순간에 적합합니다!
Florian

15

배열이나 사전을 전달할 수 있습니다. 여기서는 NSMutableDictionary를 사용하고 있습니다.

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

NSDictionary 또는 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];

이것을 매개 변수로 POST 요청에 전달하면 +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'오류가 발생합니다. XCode 9.0 사용
Daya Kevin

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

이 코드는 jsondata를 얻는 데 유용 할 수 있습니다.


생각합니다 NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers.
afp

1

Swift에서 다음 도우미 함수를 만들었습니다.

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

이것은 요청한 질문처럼 수행되지 않습니다. prettyPrint는 문자열로 스쿼시하려고 할 때 간격을 유지합니다.
Sean Lintern

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

이것은 원래 Objective-C 인쇄 스타일에 매우 가깝습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.