使用路径检索json中的子项

时间:2014-08-02 01:38:23

标签: json dart

我有以下json包含站点地图数据。我也使用这个json进行导航。

  {
        "home" : "home",
        "about" : "about",
        "contact" : "contact",
        "products" :
        {
            "home" : "home",
            "list" : "list",
            "product" :
            {
                "home" : "home",
                "specs" : "specs",
                "warranty" : "warranty",
                "related" : "related"
            }
        } }

程序启动后,这个json存储在像这样的变量

Future _loadData()
{
    return _http.get(url)
    .then((response){
        nav = response.data;
    });
}

此外,我有一个列表/数组来获取当前页面和路径

  

列表   ----主页>产品>产品

现在用户在产品页面中,我需要将产品的孩子显示为

的导航链接
  • home
  • specs
  • 保修
  • 相关

三个相关问题: 我该怎么做呢? 使用json存储和检索站点地图数据是一个好主意吗? 请问xml套件吗?

3 个答案:

答案 0 :(得分:2)

首先,您应将其转换为Dart数据结构

import 'dart:convert' show JSON;

Map sitemap = JSON.decode(nav);

然后你可以调查调试器中的sitemap变量,看看它的结构和访问数据,如

print(sitemap['products']['product']['warranty']);

(应打印warranty

您还可以迭代数据

sitemap.keys.forEach((e) {
  print(e);
});

答案 1 :(得分:0)

你可以使用像这样的递归函数(它可能会被优化):

dynamic json_xpath(dynamic json, String path) {
  // Remove trailing '/'
  path = path.substring(1);
  // Get parts
  List<String> parts = path.split('/');
  // Return json if no parts, or we're at the end
  if(parts.length == 0 || parts.first == "") {
    return json;
  }
  // check if it is a map
  if(json is Map) {
    if(json.containsKey(parts.first)) {
      return json_xpath(json[parts.first], '/'+parts.skip(1).join('/'));
    } else {
      throw "Unknown part: ${parts.first}";
    }
  } else {
    throw "Unable to resolve path";
  }

  return null;
}

这样的用法:

Dynamic json = ...;
print(json_xpath(json, '/products/product'));

此致 罗伯特

答案 2 :(得分:0)

正如Günter所说,最好先将json字符串转换为地图。从路径获取映射值的函数可能与此类似:

dynamic mapValueFromPath(Map map, String path) {
  List<String> parts = path.split('/');
  dynamic value = map;
  for (String part in parts) {
    if (value is Map) {
      value = value[part];
    } else {
      return null;
    }
  }
  return value;
}

假设json是您在上面提出的结构的示例用法:

Map map = JSON.decode(json);
expect(mapValueFromPath(map, 'products/product/warranty'), "warranty");