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

如何在 Swift 中从 NSDictionary 生成 JSON 数据

读取 JSON 数据的 NSDictionary