Ios 获取递归NSDictionary和NSArray格式的JSON

Ios 获取递归NSDictionary和NSArray格式的JSON,ios,objective-c,json,recursion,Ios,Objective C,Json,Recursion,我是Xcode新手,很难找到从JSON获取NSArray和NSDictionary的解决方案。请任何人帮帮我。 这里是我的JSON: [ { "categoryID": "1", "category_parentID": "0", "category_name_english": "Telivision", "category_name_arabic": "واعتلاء ثم. حاول المضي عن أخر",

我是Xcode新手,很难找到从JSON获取NSArray和NSDictionary的解决方案。请任何人帮帮我。 这里是我的JSON:

[
    {
        "categoryID": "1",
        "category_parentID": "0",
        "category_name_english": "Telivision",
        "category_name_arabic": "واعتلاء ثم. حاول المضي عن أخر",
        "category_date_edited": "2013-02-16 06:55:02",
        "sub": [
            {
                "categoryID": "2",
                "category_parentID": "1",
                "category_name_english": "Sharp",
                "category_name_arabic": "واعتلاء ثم. حاول المضي عن أخر",
                "category_date_edited": "2013-02-16 06:55:02",
                "sub": []
            },
            {
                "categoryID": "5",
                "category_parentID": "1",
                "category_name_english": "LG",
                "category_name_arabic": "",
                "category_date_edited": "2014-05-22 00:00:00",
                "sub": [
                    {
                        "categoryID": "7",
                        "category_parentID": "5",
                        "category_name_english": "LG 1",
                        "category_name_arabic": "",
                        "category_date_edited": "2014-05-22 00:00:00",
                        "sub": []
                    },
                    {
                        "categoryID": "8",
                        "category_parentID": "5",
                        "category_name_english": "LG 2",
                        "category_name_arabic": "",
                        "category_date_edited": "2014-05-17 00:00:00",
                        "sub": []
                    }
                ]
            }
        ]
    },
    {
        "categoryID": "3",
        "category_parentID": "0",
        "category_name_english": "Computer",
        "category_name_arabic": "واعتلاء ثم. حاول المضي عن أخر",
        "category_date_edited": "2013-02-16 06:55:02",
        "sub": [
            {
                "categoryID": "4",
                "category_parentID": "3",
                "category_name_english": "HP COLOUR",
                "category_name_arabic": "واعتلاء ثم. حاول المضي عن أخر",
                "category_date_edited": "2013-02-16 06:55:02",
                "sub": []
            },
            {
                "categoryID": "6",
                "category_parentID": "3",
                "category_name_english": "dell",
                "category_name_arabic": "",
                "category_date_edited": "2014-05-16 00:00:00",
                "sub": [
                    {
                        "categoryID": "10",
                        "category_parentID": "6",
                        "category_name_english": "i5",
                        "category_name_arabic": "",
                        "category_date_edited": "2014-05-09 00:00:00",
                        "sub": []
                    },
                    {
                        "categoryID": "11",
                        "category_parentID": "6",
                        "category_name_english": "i7",
                        "category_name_arabic": "",
                        "category_date_edited": "2014-05-23 00:00:00",
                        "sub": []
                    }
                ]
            }
        ]
    },
    {
        "categoryID": "12",
        "category_parentID": "0",
        "category_name_english": "Mobile",
        "category_name_arabic": "",
        "category_date_edited": "2014-05-15 00:00:00",
        "sub": []
    }
]
我的代码在这里:

- (void)viewDidLoad
{
    [super viewDidLoad];
    RADataObject *category;
    for (NSDictionary *dict in JSONArray) {
        NSArray *subArray = [dict valueForKey:@"sub"];
        if(subArray.count ==0) {
            category = [RADataObject dataObjectWithName:[dict valueForKey:category_name_english] children:nil];
        }
        else {
            category = [RADataObject dataObjectWithName:[dict valueForKey:category_name_english] children:[self getSubCategories:subArray]];
        }
        [mutableAddArray addObject:category];
    }
    self.data = [mutableAddArray copy];
}

-(NSArray *)getSubCategories:(NSArray *)subArray
{
    NSMutableArray *duplicate = [[NSMutableArray alloc]init];
    for (NSDictionary *dct in subArray) {
        [duplicate addObject:[dct valueForKey:category_name_key]];
    }
    NSArray *returnArray = [duplicate copy];
    return returnArray;
}

可以使用递归吗?

给你!一定要运行它,希望它能帮助你

-(NSMutableArray *)parsingWithJsonArray:(NSArray *)array
{
   for (dictionary in array)
  {
    NSDictionary *categoryEnglishDict = [dictionary objectForKey:@"category_name_english"];

    [mutableArray addObject:categoryEnglishDict];

    NSArray *subArray = [dictionary objectForKey:@"sub"];

    [self parsingWithJsonArray:subArray];
  }

  return mutableArray;  //This mutable array would contain category english language.
}

任何其他信息请告诉我。

此代码可能适用于您的。。没有检查

-(void)getSubCategories:(NSArray *)subArray
{
for (NSDictionary *myDict in subArray)
{

NSString *first = [myDict objectForKey : @"category_name_english"];
NSArray *myubArray = [myDict objectForKey : @"sub"];
if([mysubArray count])
 [self getSubCategories:mySubArray];


}
}

首先,您应该定义一个数据存储对象来存储您的类别-

NSMutableArray *categories=[[NSMutableArray alloc]init];

for (NSDictionary *dict in JSONArray) {
   [categories addObject:[SOCategory categoryWithDictionary:dict]];
}
SOCategory.h

@interface SOCategory : NSObject

-(NSArray *)subCategories;
+(SOCategory *)categoryWithDictionary:(NSDictionary *)dictionary;

@property (copy,nonatomic) NSString *categoryName;

@end
SOCategory.m

#import "SOCategory.h"

@interface SOCategory ()

@property (strong,nonatomic) NSMutableArray *subCategoryStore;

@end

@implementation SOCategory

-(id) init {
    self=[super init];
    if (self != nil) {
        _subCategoryStore=[[NSMutableArray alloc]init];
    }

    return self;
}

+(SOCategory *)categoryWithDictionary:(NSDictionary *)dictionary
{
    SOCategory *newCat=[[SOCategory alloc]init];
    if (newCat != nil) {
        newCat.categoryName=(NSString *)[dictionary objectForKey:@"category_name_english"];
        NSArray *subCats=(NSArray *)[dictionary objectForKey:@"sub"];
        for (NSDictionary *dict in subCats) {
            [newCat.subCategoryStore addObject:[SOCategory categoryWithDictionary:dict]];
        }
    }
    return newCat;
}

-(NSArray *)subCategories {
    return ([NSArray arrayWithArray:self.subCategoryStore]);
}

@end
然后,在现有代码中,可以填充类别数组-

NSMutableArray *categories=[[NSMutableArray alloc]init];

for (NSDictionary *dict in JSONArray) {
   [categories addObject:[SOCategory categoryWithDictionary:dict]];
}

请注意,此代码不会报告格式不正确的词典的错误。

您需要在哪个键中检索我要检索键“category\u name\u english”和“sub”的值。您试图将信息提取到什么数据结构中?它当然有一个递归结构,所以你可以使用递归,但你需要定义一个适当的递归数据结构,将“category_name_english”的值提取为NSString,而“sub”的值应为NSArrayWhat@Paulw11说的——这(显然)是一个递归模型,通过递归算法轻松自然地处理,但您需要具有类似递归的目标数据模型。不涉及黑魔法——只需要思考。[字典对象forkey:@“category\u name\u english”]返回NSString,我想要那个字符串,同时那个是子数组。可能吗@Walle84您可以将该字符串添加到可变数组中,因为函数将返回包含所有字符串的可变数组。只需按您的要求用“编辑”来运行一下即可。@Binni欢迎您,也别忘了投票并选择它作为正确答案。对不起。应该是
newCat
而不是
self
-我已经更正了答案,我还更改了类名以避免冲突