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

news/2024/7/20 22:03:24 标签: ios, json, objective-c

新手入门
请多指教

文章目录

  • 前言
  • Object C
  • Foundation
  • dataWithJSONObject
  • options
          • NSJSONWritingPrettyPrinted
          • NSJSONWritingSortedKeys
          • NSJSONWritingFragmentsAllowed
          • NSJSONWritingWithoutEscapingSlashes

前言

好嘛,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的对象必须具有如下属性:

  • 顶层对象必须是NSArray或者NSDictionary
  • 所有的对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull
  • 所有NSDictionary的key必须是NSString类型
  • 数字对象不能是非数值或无穷(NSNumber)

dataWithJSONObject

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

  • 如果该对象无法生成有效的JSON格式则会抛出异常。
  • 可以通过 option 设置成 NSJSONWritingPrettyPrinted 用来生成更具可读性的带有空格和缩进的JSON格式。
  • 如果option不设置,则生成标准的JSON格式
  • 如果发生错误,返回值则为 nil
  • 返回的JSON数据编码格式为UTF-8
// 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));

jsonwritingoptions/nsjsonwritingprettyprinted?changes=latest_minor&language=objc">NSJSONWritingPrettyPrinted

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

// NSJSONWritingPrettyPrinted 参数输出结果
{
        "key":"value",
        "key2":"value2"
}
jsonwritingoptions/nsjsonwritingsortedkeys?changes=latest_minor&language=objc">NSJSONWritingSortedKeys

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

// NSJSONWritingSortedKeys 参数输出结果

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

jsonwritingoptions/nsjsonwritingfragmentsallowed?changes=latest_minor&language=objc">NSJSONWritingFragmentsAllowed

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

// NSJSONWritingFragmentsAllowed 参数

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

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

// 其它参数
会抛出异常
jsonwritingoptions/nsjsonwritingwithoutescapingslashes?changes=latest_minor&language=objc">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)


http://www.niftyadmin.cn/n/1525947.html

相关文章

iOS FLAnimatedImage控制Gif播放次数

新手入门 请多指教 文章目录前言分析解决方式1. 暴力解决(不建议&#xff09;2. 换个Gif 图&#xff08;灰常推荐&#xff09;3. 使用setLoopCompletionBlock监控4. 考虑使用动画参考文献前言 要展示gif图片啊&#xff0c;但是UI提供的gif图是循环的&#xff0c;这边需求gif只…

iOS Object-C基础整理

新手入门 请多指教 本文&#xff1a;https://www.jianshu.com/p/f113b8c2150e 文章目录前言UIView 隐藏显示Layer 简单动画JSON转换字体加粗布局约束UIView 加边框分割字符串反转数组UIViewController的生命周期延迟执行前言 虽然这些东西都比较基础&#xff0c;说实话&#x…

iOS js交互直接卡死的问题

新手入门 请多指教 前言 由于页面部分统计图使用的JavaScript中的eChart库实现&#xff0c;所以最近的需求改动中&#xff0c;需要处理部分交互问题。其中有一个交互&#xff0c;在iOS12中直接卡死了。。。 嗯&#xff0c;测试部有一部iOS12的手机。。。 问题定位 通过逐步排…

Android shape动态修改颜色

Android 成长在于积累和分享 本文&#xff1a;https://www.jianshu.com/p/9ec153ba03d8 文章目录前言解决方案修改Solid颜色修改Stroke颜色Shapeshape对应的GradientDrawableGradientDrawable修改solid颜色修改Stroke颜色结语参考文献前言 Andoid 中很多圆角或者边线的操作都喜…

简单选择排序、堆排序

转载&#xff1a;http://blog.csdn.net/pzhtpf/article/details/7559943 1&#xff09;基本思想&#xff1a;在要排序的一组数中&#xff0c;选出最小的一个数与第一个位置的数交换&#xff1b; 然后在剩下的数当中再找最小的与第二个位置的数交换&#xff0c;如此循环到倒数第…

Android 源码变迁

Android 成长在于积累和分享 本文&#xff1a;https://www.jianshu.com/p/a3f2a9acf871 文章目录前言GitHubMain BranchAndroid-XX BranchHistory其它问题参考文献前言 突发奇想的想了解下Android各个版本的历史变迁&#xff0c;当然不是说功能的变迁&#xff0c;仅仅是源代码…

直接插入排序,希尔排序

转载地址&#xff1a;http://blog.csdn.net/pzhtpf/article/details/7559896 先来看看8种排序之间的关系&#xff1a; 1&#xff0c; 直接插入排序 &#xff08;1&#xff09;基本思想&#xff1a;在要排序的一组数中&#xff0c;假设前面(n-1) [n>2] 个数已经是排 好顺序的…

利用activity-alies解决微信支付的包名WXPayEntryActivity不一致问题

总结之前的一些资料 本文&#xff1a;https://www.jianshu.com/p/2b516efb8dee 文章目录前言解决方案WXPayEntryActivity类Manifest声明activity-alies参考文献前言 在集成微信支付的过程中&#xff0c;WXPayEntryActivity 类要求必须放在 包名wxapi 路径下&#xff0c;否则是…