0

多くの id キーと ref キーを持つ、これに似た JSON があります。

jSon = {
        "id":"node1",
        "name":"Languages",
        "rel":"",
        "children":1,
        "step":1,
        "path":1,
        "nodes":[
            {
                "id":"node2",
                "name":"Java",
                "rel":"Pure Object Oriented Prog",
                "children":1,
                "step":2,
                "path":2,
                "nodes":[
                    {
                        "id":"node3",
                        "name":"C#",
                        "rel":"Framework",
                        "children":0,
                        "step":3,
                        "path":3,
                        "nodes":[]
                    },{
                        "id":"node4",
                        "name":"C++",
                        "rel":"OOPS",
                        "children":0,
                        "step":3,
                        "path":4,
                        "nodes":[]
                    }]
            }]
    };

idObjective-Cでは、キーがあり、値がある要素の親ノードに到達するにはどうすればnode4よいでしょうか。

MVCxcode で、 webから JSON データを解析しようとしていますAPI

私のweb.apiJSONはこれです

をコメントアウトするNewtonsoft.Json.PreserveReferencesHandling.Objectsと、JSON は非常に大きくなり、通常は 35MB 程度になります。

を使用すると、オブジェクトを繰り返すためPreserveReferencesHandling.Objectsの .net プットidrefキーが使用されます。

JSON を移動するときに、 value のキーに到達した場合、refキーと値 `asdf を使用しasdfgてノードを検索する必要があります。id

これは可能Xcodeですか?

4

1 に答える 1

0

ノードを最も速く見つけると思われる方法に応じて、深さ優先または幅優先の検索を行う必要があります。これは、必要なコードに対する非常に未テストの試みです。

深さ優先

- (id)nodeWithID:(NSString *)identifier inDict:(NSDictionary *)dict
{
    id node = nil;
    if ([dict[@"id"] isEqualToString:identifier])
    {
        node = dict;
    }
    else
    {
        // Traverse the inner nodes to perform a depth-first search
        for (NSDictionary *innerNode in dict[@"nodes"])
        {
            node = [self nodeWithID:identifier inDict:innerNode];
            // Break once a node is found
            if (node != nil)
            {
                break;
            }
        }
    }
    return node;
}

幅優先

- (id)nodeWithID:(NSString *)identifier inDict:(NSDictionary *)dict
{
    id node = nil;

    if ([dict[@"id"] isEqualToString:identifier])
    {
        node = dict;
    }
    else
    {
        // Perform a breadth-first search
        NSMutableArray *nextDictionaries = [[NSMutableArray alloc] initWithArray:dict[@"nodes"]];
        while (node == nil && [nextDictionaries count] > 0)
        {
            dict = nextDictionaries[0];
            if ([dict[@"id"] isEqualToString:identifier])
            {
                node = dict;
            }
            else
            {
                [nextDictionaries addObjectsFromArray:dict[@"nodes"]];
                [nextDictionaries removeObjectAtIndex:0];
            }
        }
    }

    return node;
}

*編集* または、派手になりたい場合は、次のカテゴリを作成しますNSDictionary

typedef NS_ENUM(NSUInteger, NSIdentifierSearchOptions) {
    NSIdentifierSearchOptionBreadthFirst = 0,
    NSIdentifierSearchOptionDepthFirst = 1
};

@interface NSDictionary (IdentifierSearch)

- (id)objectForKeyIdentifier:(NSString *)identifier options:(NSIdentifierSearchOptions)options;

@end

@implementation NSDictionary (IdentifierSearch)

- (id)objectForKeyIdentifier:(NSString *)identifier options:(NSIdentifierSearchOptions)options
{
    id object = nil;
    switch (options)
    {
        case NSIdentifierSearchOptionBreadthFirst:
        {
            object = [[self class] breadthFirstNodeWithID:identifier inDict:self];
            break;
        }
        case NSIdentifierSearchOptionDepthFirst:
        {
            object = [[self class] depthFirstNodeWithID:identifier inDict:self];
            break;
        }
    }
    return object;
}

+ (id)breadthFirstNodeWithID:(NSString *)identifier inDict:(NSDictionary *)dict
{
    id node = nil;

    if ([dict[@"id"] isEqualToString:identifier])
    {
        node = dict;
    }
    else
    {
        // Perform a breadth-first search
        NSMutableArray *nextDictionaries = [[NSMutableArray alloc] initWithArray:dict[@"nodes"]];
        while (node == nil && [nextDictionaries count] > 0)
        {
            dict = nextDictionaries[0];
            if ([dict[@"id"] isEqualToString:identifier])
            {
                node = dict;
            }
            else
            {
                [nextDictionaries addObjectsFromArray:dict[@"nodes"]];
                [nextDictionaries removeObjectAtIndex:0];
            }
        }
    }

    return node;
}

+ (id)depthFirstNodeWithID:(NSString *)identifier inDict:(NSDictionary *)dict
{
    id node = nil;
    if ([dict[@"id"] isEqualToString:identifier])
    {
        node = dict;
    }
    else
    {
        // Traverse the inner nodes to perform a depth-first search
        for (NSDictionary *innerNode in dict[@"nodes"])
        {
            node = [self depthFirstNodeWithID:identifier inDict:innerNode];
            // Break once a node is found
            if (node != nil)
            {
                break;
            }
        }
    }
    return node;
}

@end
于 2013-09-27T11:01:52.660 に答える