【问题标题】:NSdictionary to JSON data is being sortedNSdictionary 到 JSON 数据正在排序
【发布时间】: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 是我的某些键有“@”符号而其他键没有
  • 我一进办公室就发布解决方案! (大约一个小时)
  • 我得到了解决方案:stackoverflow.com/questions/15125562/…比你们大家

标签: ios json nsdictionary


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多