iOS:JSON无序显示字典。如何呈现重新排序?

iOS:JSON无序显示字典。如何呈现重新排序?,ios,objective-c,json,dictionary,Ios,Objective C,Json,Dictionary,假设我们有以下词典: dict = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:currentItem], @"item number", [NSNumber numberWithInt:([[item valueForKey:@"section"] intValue]+1)], @"section number",

假设我们有以下词典:

dict = [NSDictionary dictionaryWithObjectsAndKeys:
                [NSNumber numberWithInt:currentItem], @"item number",
                [NSNumber numberWithInt:([[item valueForKey:@"section"] intValue]+1)], @"section number",
                currentDate, @"date of item",
                [NSNumber numberWithDouble:timeDifference], @"time difference in millis",
                        nil];
然后我得到以下输出:

{
  "time difference in millis" : 5.220093071460724,
  "section number" : 1,
  "date of item" : "28/04/2014 15:56:54,234",
  "item number" : 3
}
我使用以下代码将字典转换为JSON:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding]; 
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\" withString:@""];
如何操作JSON字符串显示其键的顺序。例如,我希望:

{
  "item number" : 3,
  "section number" : 1,
  "date of item" : "28/04/2014 15:56:54,234",
  "time difference in millis" : 5.220093071460724
}
或者别的什么。关键是我想控制这个过程。我怎么得到它?我的第一个想法是编写一个解析器,以我想要的方式显示顺序

这里有一些类似的问题,但我的重点是操纵顺序,而不是重新创建从字典中输入的顺序


词典不是按定义排序的。
如果您想拥有相同的顺序,最简单的方法是将所有内容包装到NSArray中。

NSDictionary不是按定义排序的。
如果您想要相同的订单,最简单的方法是将所有内容都打包到NSArray中。

您不应该这样做。字典没有顺序,编写一些使用顺序的代码只会在将来导致问题


也就是说,如果您愿意,您可以编写自己的代码,从(有序的)键数组和值字典生成JSON字符串。

您不应该这样做。字典没有顺序,编写一些使用顺序的代码只会在将来导致问题


也就是说,如果您愿意,您可以编写自己的代码,从(有序的)键数组和值字典中生成JSON字符串。

重申一个问题:如何接受一个固有的无序输入,生成一个固有的无序字符串,但其规格说明是固有的,但控制该字符串的顺序

将字典重新格式化为数组可以让您控制输入顺序,但会产生不同的输出格式

我能想象的想要这样做的唯一原因是,我不希望将JSON字符串作为JSON使用,而只是作为字符串使用。然后,这个问题可以重新表述为对字符串重新进行词汇格式化

它必须具有多大的通用性?我们可以假设JSON具有简单的标量值吗?然后

- (NSString *)reorderJSON:(NSString *)json keys:(NSArray *)orderedKeys {

    NSArray *splitJson = [json componentsSeparatedByString:@","];
    NSMutableArray *splitResult = [NSMutableArray array];

    for (NSString *key in orderedKeys) {
        for (NSString *splitPair in splitJson) {
            if ([self jsonPair:splitPair hasKey:key]) {
                NSString *trimmedSplitPair = [splitPair stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"{}"]];
                [splitResult addObject:trimmedSplitPair];
            }
        }
    }
    NSString *joinedResult = [splitResult componentsJoinedByString:@","];
    return [NSString stringWithFormat:@"{%@\n}", joinedResult];
}

- (BOOL)jsonPair:(NSString *)pair hasKey:(NSString *)key {

    // pair should begin with double quote delimited key
    NSString *trimmedPair = [pair stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSArray *splitPair = [trimmedPair componentsSeparatedByString:@"\""];
    return [splitPair[1] isEqualToString:key];
}
可以这样称呼:

- (void)testJson {

    NSDictionary *d = @{ @"time difference in millis": @5.220093071460724,
                         @"section number": @1,
                         @"date of item" : @"28/04/2014 15:56:54,234",
                         @"item number": @3};

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:d options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];

    NSArray *orderedKeys = @[ @"item number", @"section number", @"date of item", @"time difference in millis"];
    NSString *result = [self reorderJSON:jsonString keys:orderedKeys];
    NSLog(@"%@", result);
}

为了重申这个问题:如何接受一个固有的无序输入,生成一个规范固有的无序字符串,但控制该字符串的顺序

将字典重新格式化为数组可以让您控制输入顺序,但会产生不同的输出格式

我能想象的想要这样做的唯一原因是,我不希望将JSON字符串作为JSON使用,而只是作为字符串使用。然后,这个问题可以重新表述为对字符串重新进行词汇格式化

它必须具有多大的通用性?我们可以假设JSON具有简单的标量值吗?然后

- (NSString *)reorderJSON:(NSString *)json keys:(NSArray *)orderedKeys {

    NSArray *splitJson = [json componentsSeparatedByString:@","];
    NSMutableArray *splitResult = [NSMutableArray array];

    for (NSString *key in orderedKeys) {
        for (NSString *splitPair in splitJson) {
            if ([self jsonPair:splitPair hasKey:key]) {
                NSString *trimmedSplitPair = [splitPair stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"{}"]];
                [splitResult addObject:trimmedSplitPair];
            }
        }
    }
    NSString *joinedResult = [splitResult componentsJoinedByString:@","];
    return [NSString stringWithFormat:@"{%@\n}", joinedResult];
}

- (BOOL)jsonPair:(NSString *)pair hasKey:(NSString *)key {

    // pair should begin with double quote delimited key
    NSString *trimmedPair = [pair stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSArray *splitPair = [trimmedPair componentsSeparatedByString:@"\""];
    return [splitPair[1] isEqualToString:key];
}
可以这样称呼:

- (void)testJson {

    NSDictionary *d = @{ @"time difference in millis": @5.220093071460724,
                         @"section number": @1,
                         @"date of item" : @"28/04/2014 15:56:54,234",
                         @"item number": @3};

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:d options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];

    NSArray *orderedKeys = @[ @"item number", @"section number", @"date of item", @"time difference in millis"];
    NSString *result = [self reorderJSON:jsonString keys:orderedKeys];
    NSLog(@"%@", result);
}

我不想要它,但由于输出也需要由非程序员解释,因此他们认为更方便阅读的顺序将帮助他们不会被json语法分心。你不应该导出json供人阅读。导出一个CSV,让他们将其导入excel或类似的东西……好吧,我已经用json实现了很多东西。所以我可以将其转换为CSV,但我认为应该有一种更有效的方法。你怎么看?有效的方法就是根据情况使用适当的技术。JSON最适合机器读取。UI最适合人类阅读-如何将数据传送到UI是一个偏好/可用性的问题。我不想要它,但是,由于输出也需要由非程序员解释,因此他们认为更方便阅读的顺序将有助于他们不会被json语法分心。你不应该导出json供人阅读。导出一个CSV,让他们将其导入excel或类似的东西……好吧,我已经用json实现了很多东西。所以我可以将其转换为CSV,但我认为应该有一种更有效的方法。你怎么看?有效的方法就是根据情况使用适当的技术。JSON最适合机器读取。用户界面最适合人类阅读——如何将数据传送到用户界面取决于用户的偏好/可用性。