NSdictionary 到 JSON 数据正在排序
Posted
技术标签:
【中文标题】NSdictionary 到 JSON 数据正在排序【英文标题】:NSdictionary to JSON data is being sorted 【发布时间】:2013-12-09 06:50:09 【问题描述】:我必须以 JSON 格式邮寄数据。我有包含键和值的 nsdictionary。
NSDictionary *params_country=[NSDictionary dictionaryWithObjectsAndKeys:
@"1111",@"@id",
nil];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
@"dummy3", @"@name",
@"dummy3@example.com", @"@mail",
@"password",@"@password", params_country,@"country",
nil];
当我在做日志时
DLog(@"params %@",[params description]);
我得到以下内容
params
"@mail" = "dummy3@example.com";
"@name" = dummy3;
"@password" = password;
问题是我必须按照我在上面的 nsdictionary 初始化中列出的顺序发送 JSON,但是键正在以某种方式排序。
有什么办法吗?
编辑
对不起,我也在参数中发送了一个 nsdictionary。如果我删除该国家/地区,那就没问题了。
【问题讨论】:
能否粘贴您发送到服务器的预期 JSON 格式? pb 是我的某些键有“@”符号而其他键没有 我一进办公室就发布解决方案! (大约一个小时) 我得到了解决方案:***.com/questions/15125562/…比你们大家 【参考方案1】:字典是一种无序的集合类型。如果你需要保持一定的顺序,那么你应该使用像 NSArray 这样的有序集合类型。但是为此,您的 Web 服务不应该关心顺序,因为它应该通过提供的键查找值。
【讨论】:
您好,感谢您的回复,但就我而言,是的,网络服务正在处理订单。所以我应该按顺序发送数据。 这违反了 JSON 规范,该规范规定“对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串、数字、布尔值、空值、对象或数组。”因此,您使用的不是 JSON。如果你想让它工作,你需要构建你自己的 NSData 对象,或者你可以修复你的网络服务。【参考方案2】:根据一些 cmets,此要求确实不匹配有效的 JSON 对象,正如官方 JSON Specification 所述:
对象是一组无序名称/值对。对象以 (左大括号)开始,以 (右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。
不幸的是,我们并不是生活在一个拥有完美网络服务的完美世界中,而且通常有些事情是我们无法控制的。
在网上阅读后,我写了一个NSMutableDictionary
的子类,它将根据您调用setValue:forKey:
的顺序对字典进行排序。
我把这门课放到了一个 gist 中,你可以从这里下载:https://gist.github.com/liamnichols/7869468 或者你可以从下面复制它:
LNOrderedMutableDictionary.h
@interface LNOrderedMutableDictionary : NSMutableDictionary
///If `anObject` is nil, it will not be added to the dictionary.
- (void)setNothingIfNil:(id)anObject forKey:(id)aKey;
@end
LNOrderedMutableDictionary.m
#import "LNOrderedMutableDictionary.h"
@interface LNOrderedMutableDictionary ()
@property (nonatomic, strong) NSMutableDictionary *dictionary;
@property (nonatomic, strong) NSMutableOrderedSet *array;
@end
@implementation LNOrderedMutableDictionary
- (id)initWithCapacity:(NSUInteger)capacity
self = [super init];
if (self != nil)
self.dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity];
self.array = [[NSMutableOrderedSet alloc] initWithCapacity:capacity];
return self;
- (id)init
self = [self initWithCapacity:0];
if (self)
return self;
- (void)setObject:(id)anObject forKey:(id)aKey
[self.array removeObject:aKey];
[self.array addObject:aKey];
[self.dictionary setObject:anObject forKey:aKey];
- (void)setNothingIfNil:(id)anObject forKey:(id)aKey
if (anObject != nil)
[self setObject:anObject forKey:aKey];
- (void)removeObjectForKey:(id)aKey
[self.dictionary removeObjectForKey:aKey];
[self.array removeObject:aKey];
- (NSUInteger)count
return [self.dictionary count];
- (id)objectForKey:(id)aKey
return [self.dictionary objectForKey:aKey];
- (NSEnumerator *)keyEnumerator
return [self.array objectEnumerator];
@end
如果可能,您的 Web 服务不应该依赖 JSON 对象以特定顺序格式化,但如果您无法更改这一点,那么上述解决方案就是您要寻找的解决方案。
来源:cocoawithlove
【讨论】:
以上是关于NSdictionary 到 JSON 数据正在排序的主要内容,如果未能解决你的问题,请参考以下文章
使用带有数组的 NSDictionary 创建 JSON 文件
如何通过填充 NSDictionary 以 JSON 格式发送 UIImage
JSON NSDictionary 在输出到日志时显示空描述
NSDictionary 到 Xamarin.iOS 中的 Json