如何在IOS中为此Json响应动态创建可变字典

时间:2016-01-25 07:07:34

标签: ios json dictionary

这是我的时间条目Spent_on的JSON响应1:“2015-12-27”

{
    "A": {
        "user": {
            "id": 1,
            "name": "B"
        },
        "startday": "2015-12-27",
        "status": "New",
        "total": 2,
        "time_entries": [{
            "id": 768,
            "project": {
                "id": 8,
                "name": "C"
            },
            "user": {
                "id": 1,
                "name": "B"
            },
            "activity": {
                "id": 8,
                "name": "D"
            },
            "hours": 2,
            "comments": "",
            "spent_on": "2015-12-27"
        }]
    }
}

我创建了这样的字典格式来进行后期操作:

NSDictionary * response =@{@"A": @{@"user": @{@"id": @1,@"name": @"B"},@"startday@": @"2015-12-27",@"status@": @"New",@"total@": 2,@"time_entries@": [{@"id@": 768,@"project@": {@"id@": 8,@"name": @"C"},@"user": {@"id": 1,@"name": @"B"},@"activity": {@"id": 8,@"name": @"D"},@"hours": 2,@"comments": @"",@"spent_on": @"2015-12-27"}]}};

这是我的JSON响应2,用于时间输入Spent_on:“2015-12-27”和“2015-12-28”

{
    "A": {
        "user": {
            "id": 1,
            "name": "B"
        },
        "startday": "2015-12-27",
        "status": "New",
        "total": 6,
        "time_entries": [{
            "id": 768,
            "project": {
                "id": 8,
                "name": "C"
            },
            "user": {
                "id": 1,
                "name": "B"
            },
            "activity": {
                "id": 8,
                "name": "D"
            },
            "hours": 2,
            "comments": "",
            "spent_on": "2015-12-27"
        }, {
            "id": 775,
            "project": {
                "id": 8,
                "name": "C"
            },
            "user": {
                "id": 1,
                "name": "B"
            },
            "activity": {
                "id": 8,
                "name": "D"
            },
            "hours": 4,
            "comments": "",
            "spent_on": "2015-12-28"
        }]
    }
}

json响应2还有一个time_entry id,hours,spent_on而不是json response1.similarly,对于每个新日期(spent_on)的每个新小时条目。将生成一个新的时间条目id,并且响应长度也会增加。< / p>

那么,如何为上面的响应创建可变字典或字典,以及是否会出现不同的小时和不同的日期(例如整整一周)。如何为它创建字典?还有其他任何方法吗?谢谢。提前谢谢。

2 个答案:

答案 0 :(得分:0)

char* jsonCStr = "{             \
\"A\": {                          \
    \"user\": {                   \
        \"id\": 1,                \
        \"name\": \"B\"             \
    },                          \
    \"startday\": \"2015-12-27\",   \
    \"status\": \"New\",            \
    \"total\": 2,                 \
    \"time_entries\": [           \
    {                           \
        \"id\": 768,              \
        \"project\": {            \
            \"id\": 8,            \
            \"name\": \"C\"         \
        },                      \
        \"user\": {               \
            \"id\": 1,            \
            \"name\": \"B\"         \
        },                      \
        \"activity\": {           \
            \"id\": 8,            \
            \"name\": \"D\"         \
        },                      \
        \"hours\": 2,             \
        \"comments\": \"\",         \
        \"spent_on\": \"2015-12-27\"\
    }                           \
                     ]          \
    }                           \
}";

NSString* jsonStr = [NSString stringWithCString:jsonCStr encoding:NSUTF8StringEncoding];
NSData* jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];

答案 1 :(得分:0)

你问:

  

那么,如何为上面的响应创建可变字典或字典?

使用JSONObjectWithData解析时,请使用NSJSONReadingMutableContainers选项。这将导致可变的dictionarys /数组。

NSError *error;
NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
  

如果会出现不同的小时和不同的日期(例如整整一周),那么如何为它创建字典呢?

因此,请参考可变数组的时间条目:

NSMutableArray *timeEntries = dictionary[@"A"][@"time_entries"];

然后为新日期添加您想要的任何内容:

[timeEntries addObject:@{@"id":       @768,
                         @"project":  @{@"id": @8, @"name": @"C"},
                         @"user":     @{@"id": @1, @"name": @"B"},
                         @"activity": @{@"id": @8, @"name": @"D"},
                         @"hours":    @2,
                         @"comments": @"",
                         @"spent_on": @"2015-12-29"}];

根据需要重复(或循环)。