【问题标题】:Breaking Out JSON Result Into Localstorage Key/Value Pairs将 JSON 结果分解为本地存储键/值对
【发布时间】:2013-12-06 05:07:25
【问题描述】:

我有一个有效的 JSON 结果:

{
"metadata": [
    {
        "name": "md1",
        "value": "blah1"
    },
    {
        "name": "md2",
        "value": "blah2"
    },
    {
        "name": "tee2",
        "value": "blah3"
    }
],
"subdata1": [
    {
        "name": "sd1_1",
        "value": "blah1_1"
    },
    {
        "name": "sd1_2",
        "value": "blah1_2"
    },
    {
        "name": "sd1_3",
        "value": "blah1_3"
    },
    {
        "name": "sd1_4",
        "value": "blah1_1"
    }
],
"subdata2": [
    {
        "name": "sd2_1",
        "value": "blah2_1"
    },
    {
        "name": "sd2_2",
        "value": "blah2_2"
    },
    {
        "name": "sd2_3",
        "value": "blah2_3"
    }
]

}

通过成功的 jQuery .ajax() 调用进入:

$.ajax({
           url: 'test.json',
           type: 'get',
           datatype: 'json',
           processData: false,
           success: function(data) { //do something...};

将整个结果组合成一个与整体键关联的值相对容易:

localStorage.setItem('newtest', data);

这会将我的整个 JSON 响应保存为一个带有名为“newtest”的键的值。但是假设我希望每个数组的描述符作为键名,关联数组作为值?在我的示例中,这将给我三个键/值对,每个数组保存为一个单独的字符串值,与分别名为“元数据”、“子数据1”和“子数据2”的键相关联。我进行了大量搜索,但没有找到正确的方法。非常感谢您对解决方案的任何帮助 - 感谢您的关注和帮助。

【问题讨论】:

  • 我认为 localstorage 值必须是简单的字符串。您需要在存储数组之前对其进行序列化。
  • 如果你想使用复杂的对象而不需要序列化你应该看看IndexedDb,但是AFAIK这个API还很年轻。
  • @Blazemonger,我不是这里的专家,但如果我简单地添加:“localStorage.setItem('newtest', data);”,我会将完整的 JSON 结果无误地保存到本地存储中。如果我尝试类似:“var newdata = $(data).serializeArray();”然后是“localStorage.setItem('newtest', newdata);”,我在 ls 中得到了无穷无尽的“/n”换行符。第一种情况更可取,因为这样我就可以在没有额外字符的情况下使用完整的字符串进行操作。 FWIW,我 am 将 HTML 中的表单数据序列化/setItem/stringify-ing 到 localstorage onclick,但我需要先通过 AJAX 在加载时设置 localstorage。
  • 还有:'localStorage.setItem("newtest", data);'似乎以有效的 JSON 格式留下一个字符串,而实际上将它字符串化为 setItem 的一部分,例如'localStorage.setItem("newtest", JSON.stringify(data))' 添加正斜杠和其他无效的 JSON,即使我通过 $.ajax() 从实际 JSON 访问中删除了换行符。对于我所有的研究和尝试不同方法的尝试,这对我来说非常具有挑战性。

标签: javascript jquery json local-storage


【解决方案1】:

您可以执行 for 循环并将对象字符串化。

$.ajax({
    url: 'test.json',
    type: 'get',
    datatype: 'json',
    processData: false,
    success: function(data) {
        for(var key in data){
            localStorage.setItem(key, JSON.stringify(data[key]));
        }
    }
});

当你得到它们时再解析

JSON.parse(localStorage.getItem("metadata"));

【讨论】:

  • 这给了我一个非常棘手的系统冻结结果,似乎将 JSON 中的每个最后一个字符分解为本地存储中的单个数字,例如:键 => 值对,如 0 => "{", 1 => "\n", 10 => "a", 100 => " ", 1000 => "d" 等等。有什么想法吗?
  • 也许可以获取您的结果并通过在线 json linter 运行它以确保 json 有效。我用你的示例 json 测试了上面的代码,它工作正常。
  • 我每天多次访问 JSONLint.com,以确保我的 JSON 响应有效。我创建了一个虚拟页面,上面只有您的 Javascript 和我在顶部发布的相同 JSON - 这是我在第一次回复您时描述的相同结果的屏幕截图:!Screenshot。我希望我能理解为什么它对你有用,但对我没有用。
  • 我认为这是因为您将它作为文件而不是在服务器上运行。当您将 Chrome 作为文件运行时,Chrome 可以处理 cookie 和本地存储等内容。在此jsfiddle.net/94jjQ 上运行代码后检查本地存储
  • 我不是 100% 清楚它是如何工作的,但我发现一些线程在谈论它。这个解释了为什么 cookie 很难在本地文件上工作 - productforums.google.com/forum/#!msg/chrome/iow88FsnNhQ/… 这个解释了如何启用文件 cookie - wolfslittlestore.be/2012/08/cookies-on-local-files-in-chrome 还有一些关于 cookie 的其他 stackoverflow 线程,我假设本地存储属于类似的场景。如何将保存的数据映射到大型文件系统上的文件,用户可以移动文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2017-04-10
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多