iOS NSDictionary转JSON字符串(去除换行和空格

2021-11-08  本文已影响0人  笨鱼天阳

新手入门
请多指教

前言

好嘛,iOS组被裁净了。感觉这是个很简单的功能,也是够我查半天api的。哪里不对的,希望大家指正。

Object C

+ (NSString *)convertToJsonData:(NSDictionary *) dict {
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 
                                        options:NSJSONWritingSortedKeys 
                                        error:&error];
    NSString *jsonString;
    if (!jsonData) {
        NSLog(@"%@",error);
    } else {
        jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    return jsonString;
}

Foundation

Foundation框架提供了 NSJSONSerialization 类对JSON进行序列化处理

转换成JSON的对象必须具有如下属性:

dataWithJSONObject

该方法使用 Foundation object 生成 JSON data。

// iOS 14.4 Frameworls > Foundatopm > MSKSPMSerialization.h > NSJSONSerialization

/* Generate JSON data from a Foundation object. 
If the object will not produce valid JSON then an exception will be thrown. 
Setting the NSJSONWritingPrettyPrinted option will generate JSON with whitespace designed to make the output more readable. 
If that option is not set, the most compact possible JSON will be generated. 
If an error occurs, the error parameter will be set and the return value will be nil. 
The resulting data is a encoded in UTF-8.
 */
+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

options

这里要说一下options参数,之前查资料可以看到,大部分都是使用NSJSONWritingPrettyPrinted参数,其实这个参数会添加换行空格方便查看。
这里使用的是NSJSONWritingSortedKeys参数,不会带换行和空格。

// iOS 14.4 Frameworls > Foundatopm > MSKSPMSerialization.h > NSJSONWritingOptions

typedef NS_OPTIONS(NSUInteger, NSJSONWritingOptions) {
    NSJSONWritingPrettyPrinted = (1UL << 0),

    /* Sorts dictionary keys for output using [NSLocale systemLocale]. Keys are compared using NSNumericSearch. The specific sorting method used is subject to change.
     */
    NSJSONWritingSortedKeys API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) = (1UL << 1),
    NSJSONWritingFragmentsAllowed = (1UL << 2),
    NSJSONWritingWithoutEscapingSlashes API_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0)) = (1UL << 3),
} API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0));

NSJSONWritingPrettyPrinted

将生成的json数据使用空格和缩进格式化输出,使输出结果更具可读性。

// NSJSONWritingPrettyPrinted 参数输出结果
{
        "key":"value",
        "key2":"value2"
}
NSJSONWritingSortedKeys

按字典键值对输出JSON数据,标准格式JSON,不额外添加空格及缩进,这个枚举是iOS11后才出的,iOS11之前我们可以用 kNilOptions 来替代

// NSJSONWritingSortedKeys 参数输出结果

{"key":"value","key2":"value2"}

NSJSONWritingFragmentsAllowed

允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON片段。

// NSJSONWritingFragmentsAllowed 参数

// 原始数据
@"aaa:bbb"

// NSJSONWritingFragmentsAllowed 参数输出
"aaa:bbb"

// 其它参数
会抛出异常
NSJSONWritingWithoutEscapingSlashes

禁用正斜杠转译。
如果你的JSON中包含Html数据,很可能就需要这个参数了。

// NSJSONWritingWithoutEscapingSlashes 参数输出结果

// 原始数据
NSDictionary *dict = @{
    @"key" : @"<html>...</html>"
};

// NSJSONWritingWithoutEscapingSlashes 输出数据
{"key":"<html>...</html>"}
// 对比 NSJSONWritingSortedKeys 参数 注意:尾标签被添加了斜杠转意
{"key":"<html>...<\/html>"}

参考 - Apple Api : NSJSONWritingOptions (https://developer.apple.com/documentation/foundation/nsjsonwritingoptions?changes=latest_minor&language=objc)

上一篇下一篇

猜你喜欢

热点阅读