使用字符串访问json

时间:2015-04-17 17:22:51

标签: javascript json string object

我有一些json:data

我有一个字符串构建,如下所示: sections.1.subsections.0.items.0.citation.paragraph

我需要做的是操纵该字符串以便能够在data中访问该值。所以把它变成可用的东西: data['sections'][1]['subsections'][0]['items'][0]['citation']['paragraph']

然后用它来改变数据中的那个值。所以: data['sections'][1]['subsections'][0]['items'][0]['citation']['paragraph'] = 'new value'

我可以将.上的原始字符串拆开,然后认为让我找到某个地方,但我完全不确定如何重新使用这些部分以允许我可以在data中访问该值。

谢谢!

1 个答案:

答案 0 :(得分:3)

我仍然不太确定你为什么要以这种方式处理JSON,但如果必须这样做,那么你需要使用递归来访问数据。假设我正确映射了您的对象,下面的示例应该为您提供了执行此操作的方法:

var data = {
    sections: [
        {
            subsections: []    
        },
        {
            subsections: [
                {
                    items: [
                        {
                            citation: {
                                paragraph: "Citation by Warlock"    
                            }
                        }
                    ]
                }
            ]
        }
    ]
};

var string = "sections.1.subsections.0.items.0.citation.paragraph",
    parts = string.split('.');

function getValue(tree, index) {
    if(index < (parts.length - 1)) {
        return getValue(tree[parts[index]], index + 1);
    } else {
        return tree[parts[index]];
    }
}

function setValue(tree, index, newValue) {
    if(index < (parts.length - 1)) {
        setValue(tree[parts[index]], index + 1, newValue);
    } else {
        tree[parts[index]] = newValue;    
    }
}

alert(getValue(data, 0));
setValue(data, 0, "New Citation By Warlock");
alert(getValue(data, 0));

这个想法是getValue(...);函数将一层深入到JSON中,然后以递归方式调用自身。这允许一次一步地访问数据,直到检索到最后一部分。然后通过所有先前函数调用中的递归返回该值。

设置值时也是如此。 setValue(...);函数一次进入JSON一层,将新值传递给set,直到它到达最后一个嵌套层。然后为指定的属性设置值。

修改

更好的实现是将parts数组传递到getValue(...);setValue(...);函数以消除外部依赖性。然后,在函数内移动数组的数据值以逐步遍历嵌套层。这消除了基于原始数组值的索引跟踪的需要:

var data = {
    sections: [
        {
            subsections: []    
        },
        {
            subsections: [
                {
                    items: [
                        {
                            citation: {
                                paragraph: "Citation by Warlock"    
                            }
                        }
                    ]
                }
            ]
        }
    ]
};


var string = "sections.1.subsections.0.items.0.citation.paragraph",
    parts = string.split('.');

function getValue(temp, tree) {
    if(temp.length > 1) {
        tree = tree[temp[0]];
        temp.shift();
        return getValue(temp, tree);
    } else {
        return tree[temp[0]];
    }
}

function setValue(temp, tree, newValue) {
    if(temp.length > 1) {
        tree = tree[temp[0]];
        temp.shift();
        setValue(temp, tree, newValue);
    } else {
        tree[temp[0]] = newValue;    
    }
}

alert(getValue(parts, data));
setValue(parts, data, "New Citation By Warlock");
alert(getValue(parts, data));