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

Ios 正在对NSdictionary到JSON数据进行排序,ios,json,nsdictionary,Ios,Json,Nsdictionary,我必须以JSON格式通过post发送数据。我有一本包含键和值的词典 NSDictionary *params_country=[NSDictionary dictionaryWithObjectsAndKeys: @"1111",@"@id", nil]; NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: @"dummy3", @"@name", @"dummy3@example

我必须以JSON格式通过post发送数据。我有一本包含键和值的词典

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也在params中。如果我删除国家,那就没问题。

字典是无序的集合类型。如果需要维护特定的顺序,那么应该使用像NSArray这样的有序集合类型。但是对于这一点,您的web服务不应该关心顺序,因为它应该通过提供的键查找值

根据一些评论,该要求与官方声明的有效JSON对象不匹配:

对象是一组无序的名称/值对。对象以{(左大括号)开始,以}(右大括号)结束。每个名称后面跟有:(冒号),名称/值对之间用(逗号)分隔

不幸的是,我们并不是生活在一个拥有完美web服务的完美世界中,而且常常有一些事情是我们无法控制的

在互联网上阅读后,我编写了一个子类
NSMutableDictionary
,它将根据您调用
setValue:forKey:
的顺序来订购词典

我把这门课编成一个要点,你可以从这里下载:或者你可以从下面复制它:

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对象以特定的顺序进行格式化,但是如果您无法改变这一点,那么上面的解决方案就是您想要的


来源:

您好,谢谢您的回复,但就我而言,是的,网络服务正在处理订单。因此,我应该以有序的方式发送数据。这违反了JSON规范,即“对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串、数字、布尔值、null、对象或数组。”因此,您使用的不是JSON。如果你想让它工作,你需要构建你自己的NSData对象,或者你可以修复你的web服务。你能粘贴发送到服务器的expect JSON格式吗?pb是一些键,我有“@”符号,其他的我一进办公室就会发布解决方案!(大约一个小时)我得到了解决办法:比你们每个人都好