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最适合机器读取。用户界面最适合人类阅读——如何将数据传送到用户界面取决于用户的偏好/可用性。