我必须以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,但是密钥正在按某种方式排序。
任何解决方案?
修改
抱歉,我也在params中发送了一个nsdictionary。如果我删除该国家,那么罚款。
答案 0 :(得分:1)
词典是无序的集合类型。如果您需要维护某个订单,那么您应该使用有序的集合类型,如NSArray。但为此,您的Web服务不应该关心订单,因为它应该通过提供的密钥查找值。
答案 1 :(得分:1)
根据一些评论,此要求不匹配有效的JSON对象作为官方JSON Specification状态:
对象是一组无序名称/值对。对象以{(左括号)开头,以}结尾(右大括号)。每个名称后跟:(冒号),名称/值对用(逗号)分隔。
不幸的是,我们并没有生活在一个完美的网络服务世界中,而且通常有些事情是我们无法控制的。
我在互联网上阅读之后写了一个NSMutableDictionary
的子类,它将根据您调用setValue:forKey:
的顺序对字典进行排序。
我把这个课程放在了你可以从这里下载的要点: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对象,但如果您无法更改此项,那么上述解决方案就是您要寻找的。