如何从 JSON 响应中获取字段值

Posted

技术标签:

【中文标题】如何从 JSON 响应中获取字段值【英文标题】:How to get field values from JSON response 【发布时间】:2014-06-23 19:08:49 【问题描述】:

我能够从我的 API 中检索整个 JSON 响应并将其存储在 NSArray 中。

然后我遍历整个响应并将每个结果组存储在 NSDictionary 和 NSLogit 中。

但是,我不知道如何从每个组中获取字段值,例如

STNAME,
CTYNAME,
DENSITY,
POP,
DATE,
state,
county


- (void)fetchedData:(NSData *)responseData 
    //parse out the json data
    NSError* error;
    NSArray* json = [NSJSONSerialization JSONObjectWithData:responseData //1
                                                         options:kNilOptions 
                                                           error:&error];

 for (int i=0; i<[json count]; i++) 
     NSDictionary *avatars = [json objectAtIndex:i];
      NSLog(@"value at %d, :::  %@", i,avatars);
    

我想做的是得到类似的东西

//        NSString *name = avatar[@"STNAME"];  // for any specific state or county name..like objectbyKey

这样我就可以从 sep 组中获取每个值。

这就是我的 JSON 数据在 NSLog 上的样子

2014-06-23 12:04:06.893 KivaJSONDemo[2693:90b] value at 0, :::  (
    STNAME,
    CTYNAME,
    DENSITY,
    POP,
    DATE,
    state,
    county
)
2014-06-23 12:04:06.894 KivaJSONDemo[2693:90b] value at 1, :::  (
    Florida,
    "Alachua County",
    "282.65234809",
    247336,
    1,
    12,
    001
)
2014-06-23 12:04:06.894 KivaJSONDemo[2693:90b] value at 2, :::  (
    Florida,
    "Alachua County",
    "282.65234809",
    247336,
    2,
    12,
    001
)
2014-06-23 12:04:06.895 KivaJSONDemo[2693:90b] value at 3, :::  (
    Florida,
    "Alachua County",
    "283.0454668",
    247680,
    3,
    12,
    001
)
2014-06-23 12:04:06.895 KivaJSONDemo[2693:90b] value at 4, :::  (
    Florida,
    "Alachua County",
    "285.30018541",
    249653,
    4,
    12,
    001
)
.
.
.
.
.
.
.
.
.

工作:

我得到了它的工作,但这绝对不是最有效的方法。

NSString *value = @"CTYNAME";
NSUInteger idx = [json[0] indexOfObject:value];

NSString *value2=@"POP";
NSUInteger idx1 = [json[0] indexOfObject:value2];

NSString *value3=@"DENSITY";
NSUInteger idx2 = [json[0] indexOfObject:value2];


if (idx != NSNotFound)

    for (NSUInteger i = 1; i < [json count]; i=i+6)
    
        if (idx < [json[i] count])
        
            NSLog(@"County:%@             Population:%@            Density:%@", json[i][idx],json[i][idx1],json[i][idx2]);


            [CountyNames addObject:json[i][idx]];
            [CountyPopulation addObject:json[i][idx1]];
            [CountyDensity addObject:json[i][idx2]];

        
        else
        
            NSLog(@"Value %@ unavailable in %@", value, json[i]);
        
    

else

    NSLog(@"Value %@ not found.", value);

【问题讨论】:

【参考方案1】:

您从服务器返回的数据看起来像是一个数组,而不是字典数组。你想要做这样的事情。

NSArray *avatars = @[@[@"STNAME",
                       @"CTYNAME",
                       @"DENSITY",
                       @"POP",
                       @"DATE",
                       @"state",
                       @"county"],
                     @[@"Florida",
                       @"Alachua County",
                       @"282.65234809",
                       @247336,
                       @1,
                       @12,
                       @001],
                     @[@"Florida",
                       @"Alachua County",
                       @"282.65234809",
                       @247336,
                       @2,
                       @12,
                       @001],
                     @[@"Florida",
                       @"Alachua County",
                       @"283.0454668",
                       @247680,
                       @3,
                       @12,
                       @001],
                     @[@"Florida",
                       @"Alachua County",
                       @"285.30018541",
                       @249653,
                       @4,
                       @12,
                       @001]];

NSString *value = @"DENSITY";
NSUInteger idx = [avatars[0] indexOfObject:value];
if (idx != NSNotFound)

    for (NSUInteger i = 1; i < [avatars count]; ++i)
    
        if (idx < [avatars[i] count])
        
            NSLog(@"%@", avatars[i][idx]);
        
        else
        
            NSLog(@"Value %@ unavailable in %@", value, avatars[i]);
        
    

else

    NSLog(@"Value %@ not found.", value);

【讨论】:

Guy 是对的,json 数据可以作为数组和字典的任意组合出现,具体取决于数据最初编码时的方式。如果您在读取 ​​json 后对其进行 po,您可以了解您是否有一个数组数组或一个字典数组。 (将有 key : value 表达式)【参考方案2】:

这是一种常见的方法,而不是为每个对象重复键,Web 服务将回答多行,其中第一行包含键(列名),随后的行表示对象(其中值数组映射到列)。要从输入中产生您期望的结果,请考虑以下几点:

NSMutableArray *resultDictionaries = [NSMutableArray array];  // this will be our result
NSArray *keys = json[0];

for (int i=1; i<json.count; i++) 
    NSArray *row = json[i];
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:row forKeys:keys];
    [resultDictionaries addObject:dictionary];

【讨论】:

是的,数据实际上是CSV格式,粗略映射到JSON。

以上是关于如何从 JSON 响应中获取字段值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2,如何从多阶段 JSON 响应中获取值

如何从 Laravel5 中的 json 类型响应中获取值

如何从 Angular2(Typescript)中的 Json 数组中获取值的总和

如何从 iOS 中的 JSON 响应中获取价值

使用 unmarshal 从响应中获取特定的 JSON 字段

Vue.js - 如何通过 axios 响应数据从对象中获取特定字段