正在对NSdictionary到JSON数据进行排序

时间:2013-12-09 06:50:10

标签: ios json nsdictionary

我必须以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。如果我删除该国家,那么罚款。

2 个答案:

答案 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对象,但如果您无法更改此项,那么上述解决方案就是您要寻找的。

来源:cocoawithlove