dictionary
,我需要使用JSON string
生成一个dictionary
。可以转换吗?你们可以帮忙吗?#1 楼
这是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
评论
如果我们创建一个NSObject类别并使用相同的方法,则它对NSArray和NSDictionary均适用。无需编写两个单独的文件/接口。并且在出现错误的情况下应该返回nil。
–阿卜杜拉·乌梅尔
2014年7月14日4:55
您为什么认为NSUTF8StringEncoding是正确的编码?
–希思边界
2015年4月8日在2:29
没关系,文档说“结果数据以UTF-8编码”。
–希思边界
2015年4月8日在2:30
@AbdullahUmer这也是我所做的,因为我猜想它也可以在NSNumber,NSString和NSNull上使用-一两分钟后就会发现!
–本约翰
17年2月7日在13:18
#2 楼
苹果在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];
}
评论
这是一个很好的建议……让项目拥有大量的第三方库真的很烦人。
– Zakdances
2012年8月9日在6:54
转换为JSON对象的绝佳解决方案。做得好..:)
– MS。
13年8月30日在9:55
+1将其添加为NSArray和NSDictionary的类别将使重用更加简单。
– devios1
13年15月15日在21:41
如何将json转换回字典?
– OMGPOP
2014年8月8日在7:06
@OMGPOP-[NSJSONSerialization JSONObjectWithData:options:error:]从给定的JSON数据返回Foundation objec
–卢卡斯(Lukasz'Severiaan'Grela)
2014年4月15日上午10:39
#3 楼
要将NSDictionary转换为NSString:NSError * err;
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:myDictionary options:0 error:&err];
NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
#4 楼
注意:此答案是在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
11年6月16日在9:08
克隆git存储库后,@ ChandraSekhar应该足以将Classes /文件夹添加到您的项目中。
–尼克·韦弗
11年6月16日在11:15
我只是写了stackoverflow.com/questions/11765037/…来充分说明这一点。包括错误检查和一些建议。
–帕斯卡
2012年9月12日上午8:05
#5 楼
您还可以通过在调试器中输入以下内容来即时执行此操作po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:yourDictionary options:1 error:nil] encoding:4];
评论
硬编码常量有点吓人。为什么不使用NSUTF8StringEncoding等?
–伊恩·纽森(Ian Newson)
13年11月29日在14:11
目前在LLDB中不起作用:错误:使用未声明的标识符'NSUTF8StringEncoding'
–安迪
13年11月29日在14:15
非常适合那些您想快速使用外部json编辑器检查字典的时刻!
–弗洛里安
2014年7月23日在10:36
#6 楼
您可以传递数组或字典。在这里,我正在使用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);
#7 楼
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:]:JSON写入中的无效顶级类型错误。使用XCode 9.0
–达雅·凯文(Daya Kevin)
17-10-13在10:36
#8 楼
在Swift(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
}
#9 楼
现在不需要第三方类ios 5引入了NsjsonserializationNSString *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
20年1月7日在21:44
#10 楼
这将在swift 4和swift 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)
#11 楼
这是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
}
}
}
用法示例
do{
let jsonString = try dic.toString()
}
catch( let error){
print(error.localizedDescription)
}
或者,如果您确定它是有效的字典,则可以使用
let jsonString = try? dic.toString()
评论
这不会像请求的问题那样执行,当试图压入字符串时,prettyPrint会保留间距。
– Sean Lintern
18/12/7在11:24
#12 楼
在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)")
}
}
#13 楼
至少从ISO7开始,您可以使用NSJSONSerialization轻松地做到这一点。评论
根据链接,此功能实际上是从iOS 5.0(而不是7.0)开始可用的。
– manroe
15年6月10日在21:20
#14 楼
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打印样式
评论
@RicardoRivaldo就是这个任何来自google搜索的人,请仔细阅读@Guillaume
的回答