【问题标题】:Correct syntax for addressing JSON object in Jekyll _data file在 Jekyll _data 文件中寻址 JSON 对象的正确语法
【发布时间】:2019-08-01 02:25:00
【问题描述】:

我正在 Jekyll 中创建一个页面并尝试使用存储在 Jekyll 的“_data”文件夹中的 JSON 文件中的数据。 JSON 文件是“/_data/objectsandproperties.json”,包含:

{ 
    "objectA": { "propertyA": "FooA", "propertyB": "BarA" },
    "objectB": { "propertyA": "FooB", "propertyB": "BarB" },
    "objectC": { "propertyA": "FooC", "propertyB": "BarC" }
}

我想输出一个格式如下的列表:

<dl>
    <dt>objectA</dt>
        <dd>propertyA: FooA</dd>
        <dd>propertyB: BarA</dd>
    <dt>objectB</dt>
        <dd>propertyA: FooB</dd>
        <dd>propertyB: BarB</dd>
    <dt>objectC</dt>
        <dd>propertyA: FooC</dd>
        <dd>propertyB: BarC</dd>
</dl>

我目前在我的降价文件中使用 Liquid 标签,如下所示:

{% for objects in site.data.objectsandproperties %}
<dl>
  {% for object in objects %}
  <dt>Object names: {{ object }}</dt>
      <dd>propertyA: {{ object.propertyA }}</dd>
      <dd>propertyB: {{ object.propertyB }}</dd>
  {% endfor %}
</dl>
{% endfor %}

这不起作用,因为对象不是“objectA”,而是具有属性等的整个 objectA 对象。

我无权访问创建 JSON 文件的脚本,因此我无法添加标签或使其成为数组等。我希望我可以让它与 Liquid 一起使用。

谢谢。

【问题讨论】:

    标签: json jekyll liquid


    【解决方案1】:

    使用inspect 过滤器更好地了解我们正在处理的内容:

    {% for object in site.data.objectsandproperties %}
    
      {{ object | inspect }} 
      >> returns an array like :
      >> ["objectA", {"propertyA"=>"FooA", "propertyB"=>"BarA"}]
    
      name : {{ object.first }} or {{ object[0] }}
      properties : {{ object.last}} or {{ object[1] }}
    
    {% endfor %}
    

    您的代码可能如下所示:

    <dl>
    {% for object in site.data.objectsandproperties %}
      <dt>Object names: {{ object | first }}</dt>
      <dd>propertyA: {{ object.last.propertyA }}</dd>
      <dd>propertyB: {{ object.last.propertyB }}</dd>
    {% endfor %}
    </dl>
    

    【讨论】:

    • 谢谢@David Jacquel 我没有遇到检查过滤器。我今晚会试试这个,它看起来正是我需要的:-)
    【解决方案2】:

    您可以利用forloop 对象的属性访问和打印数据键:

    <dl>
    {%- for object in site.data.objectsandproperties %}
      {%- for prop in object %}
        {%- if forloop.first %}
        <dt>{{ prop }}</dt>
        {%- else %}
          {%- for subprop in prop %}
            <dd>{{ subprop[0] }}: {{ subprop[1] }}</dd>
          {%- endfor %}
        {%- endif %}
      {%- endfor %}
    {%- endfor %}
    </dl>
    

    【讨论】:

    • 谢谢@ashmaroli,我可以访问对象的属性,只是无法显示对象的名称。当 for 循环遍历 JSON 中的 N 个对象时,我需要打印出对象的名称。所以我可以说: 名称:objectA 名称:objectB 名称:objectC 我认为我不能使用您建议的语法来做到这一点。我已经通过更改 JSON 的结构来修复它,因此我有一个数组或名称/值对可以使用,但在这种情况下我无法更改 JSON。如何循环显示每个对象的键文本的 JSON 文件?
    • @DugFalby 我已经修改了我的答案,以便为给定 JSON 数据的 any 输出所需的标记。
    • 谢谢@ashmaroli 我会在今晚回到我的机器上试试这个。感谢您的澄清,这看起来不错并且很有用,该方法可用于遍历任何 JSON 对象结构:-)
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多