Tôi có một dictionary
tôi cần phải tạo JSON string
bằng cách sử dụng dictionary
. Có thể chuyển đổi nó? Các bạn có thể vui lòng giúp đỡ về điều này?
Tôi có một dictionary
tôi cần phải tạo JSON string
bằng cách sử dụng dictionary
. Có thể chuyển đổi nó? Các bạn có thể vui lòng giúp đỡ về điều này?
Câu trả lời:
Dưới đây là các danh mục cho NSArray và NSDipedia để thực hiện việc này siêu dễ dàng. Tôi đã thêm một tùy chọn cho bản in đẹp (dòng mới và tab để dễ đọc hơn).
@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
NSUTF8StringEncoding
là mã hóa chính xác?
NSNumber
, NSString
và NSNull
- sẽ tìm ra trong một hoặc hai phút!
Apple đã thêm trình phân tích cú pháp và trình tuần tự hóa JSON trong iOS 5.0 và Mac OS X 10.7. Xem NSJSONSerialization .
Để tạo chuỗi JSON từ NSDadata hoặc NSArray, bạn không cần phải nhập bất kỳ khung bên thứ ba nào nữa.
Đây là cách làm:
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];
}
NSArray
và NSDictionary
sẽ giúp việc sử dụng lại đơn giản hơn nhiều.
[NSJSONSerialization JSONObjectWithData:options:error:]
trả về objec Foundation từ dữ liệu JSON đã cho
LƯU Ý: Câu trả lời này đã được đưa ra trước khi iOS 5 được phát hành.
Lấy json-framework và làm điều này:
#import "SBJsonWriter.h"
...
SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init];
NSString *jsonString = [jsonWriter stringWithObject:myDictionary];
[jsonWriter release];
myDictionary
sẽ là từ điển của bạn.
Bạn cũng có thể thực hiện việc này một cách nhanh chóng bằng cách nhập thông tin sau vào trình gỡ lỗi
po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4];
error: use of undeclared identifier 'NSUTF8StringEncoding'
Bạn có thể vượt qua mảng hoặc từ điển. Ở đây, tôi đang dùng NSMutableDixi.
NSMutableDictionary *contentDictionary = [[NSMutableDictionary alloc]init];
[contentDictionary setValue:@"a" forKey:@"b"];
[contentDictionary setValue:@"c" forKey:@"d"];
Để tạo chuỗi JSON từ NSDipedia hoặc NSArray, Bạn không cần nhập bất kỳ khung bên thứ ba nào. Chỉ cần sử dụng mã sau đây: -
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);
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'
lỗi. Sử dụng XCode 9.0
Trong Swift (phiên bản 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
}
Bây giờ không cần lớp bên thứ ba ios 5 đã giới thiệu 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);
mã này có thể hữu ích để có được jsondata.
NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers
.
Trong Swift, tôi đã tạo chức năng trợ giúp sau:
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)")
}
}
Kể từ ISO7, ít nhất bạn có thể dễ dàng thực hiện điều này với NSJSONSerialization .
Đây là phiên bản Swift 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
}
}
}
Ví dụ sử dụng
do{
let jsonString = try dic.toString()
}
catch( let error){
print(error.localizedDescription)
}
Hoặc nếu bạn chắc chắn đó là từ điển hợp lệ thì bạn có thể sử dụng
let jsonString = try? dic.toString()
Điều này sẽ hoạt động trong swift4 và 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)
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)
}
}
}
Cái này khá gần với kiểu in Objective-C ban đầu