【问题标题】:Javascript - Advanced JSON keypathsJavascript - 高级 JSON 键路径
【发布时间】:2015-04-15 14:38:06
【问题描述】:

我正在寻找一个可以使用键路径深入解析我的 json 的库,即在字典数组中查找值。

考虑以下 JSON 对象:

{
    "root" : 
    {
        "infos" : 
        {
            "sport" : [
                        {"name" : "tennis"}, 
                        {"name" : "basket"}
                      ]
        }
    }
};

我可以做类似var sport = json.valueForKeyPath('root.infos.sport.name') 之类的事情,它应该返回["tennis", basket"]

我试过underscore-keypath.min.js,但它做不到。

有人知道可以做到这一点的图书馆吗?

【问题讨论】:

  • root.sport.nameroot.infos.sport.name?
  • 基本的javascript就可以搞定,为什么需要一个库呢?
  • @thefourtheye root.infos.sport.name 抱歉。 @void 如何在基本 JS 中完成?
  • 将您的 json 转换为 xml eg. with this service 并使用 xpath, xslt,... 进一步查询和处理数据。请注意,生成的 xml 在技术上可能格式不正确(例如,没有唯一的根节点或缺少 xml 声明)。但是,这些缺陷很容易得到弥补。

标签: javascript arrays json dictionary nested


【解决方案1】:

我做了一个小库可以做到这一点,你可以在 github 上找到它:

https://github.com/blauharley/TemplateJS

以下是您可以使用它的示例:

var objs = [
    { dim: { x: 25, y:14, z: 3}, name: 'circle'},
    { dim: { x: 19, y:17, z: 8}, name: 'triangle'},
    { dim: { x: 7, y:44, z: 12}, name: 'quad'},
    { dim: { x: 13, y:63, z: 67}, name: 'circle'},
    { dim: { x: 5, y:23, z: -2}, name: 'rectangle'}
];
var templ = new TemplateJS();
// if you have got more than one value to insert separate the values with pipes (|)
var str = "<p>{name}: | <b style='color:green'>{dim}{x}px</b> | <b style='color:red'>{dim}{y}px</b> | <b style='color:yellow'>{dim}{z}px</b></p>";
templ.transformTemplate(objs,str);

有两种方法,但 transformTemplate 更适合您的问题。它返回一个基于给定对象的字符串数组。它获取每个对象(从 objs 数组中)并将其属性值放入作为第二个参数给出的字符串中。最后,transformTemplate 返回一个转换后的 字符串数组。

第二个方法insertTemplate的作用几乎相同,但它被认为是用于将一堆值插入到HTML元素中。

带管道 |你分开对象的值和花括号是不言自明的。这个库可以假设处理无限的对象嵌套(不是数组),正如您在使用 Jasmine 完成的 TestCase 中看到的那样。

不幸的是,这两种方法都需要一个对象数组作为第一个参数,所以当你想使用这个库时,你可以这样使用它:

var source = {
  'root':
  {
    'infos':
    {
      'sport': [
        {
          'name': 'tennis'
        },
        {
          'name': 'basket'
        }
      ]
    }
  }
};
var templ = new TemplateJS();
// if you have got more than one value to insert separate the values with pipes (|)
var str = '{name}';
templ.transformTemplate(source.root.infos.sport, str); // ["tennis", "basket"]

此外,它已在所有浏览器中进行了测试。

【讨论】:

  • 谢谢,我试试看
  • 它应该满足所有需求。希望你觉得它有用。
  • Can't make it work :( 我在 Parse Cloud Code 环境中工作,我想并非所有库都允许运行。我有以下错误{"code":141,"error":"ReferenceError: TemplateJS is not defined\n at modules/test.js:19:18"}(PS:我我是 JS 的大初学者)
  • 没办法。也许你将来会在其他地方使用它,
猜你喜欢
  • 2013-02-13
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多