Jekyll / Liquid>创建JSON>哈希输出中的替换键值

时间:2015-11-04 10:43:03

标签: json jekyll liquid

警告:我不是编码员,几乎可以肯定我滥用了这些条款。

简短:

当输出数组时,如何用数据文件数组中的键的替换值替换数组中特定键的值?

为简洁起见,我将使用简化示例。

我在前面有一个关键/值数组对象。

article:
  name: An article
  date: some date
  author: Tim

我使用jsonify标签输出该数组,如下所示:

{{ page.article | jsonify }}

我还有一个像这样的人员数据文件:

Tim
  firstName: Tim
  surname: Bradley
  occupation: coffee consumer

Bob
  firstName: Robert
  surname: De Niro
  occupation: Taxi Driver

我想要做的是输出article数组,但用一个值(作者)的值(Tim)替换数据文件对象中的值(比如Bradley)。

我想这个过程可能是这样的: 1.越过阵列 2.找到作者的价值 3.将值与相应的数据项匹配 4.捕获数据项的替换值 5.用项目的键值替换替换页面数组的键值 6.输出修正数组

我想选择键值属性(“author”=>“value”),而不是它的值(“Tim”),因为在实践中,值(“Tim”)在对象中重复多次我无法选择具体的一个 - 除非有人知道怎么说在“作者”之后选择第一个蒂姆。

我不想简单地重复数组的值,因为我设想在逐个案例(逐页阅读)的基础上添加和删除键值。

我该怎么做?

这甚至可以用液体和jekyll来完成吗?

这对任何人都有意义吗?

提前感谢您的帮助!

修改

我在澄清时通过尝试添加了一些评论。我再次警告说,我几乎肯定会混淆我的术语。

我做了一些研究,我输出的是一个散列作为json对象。

基本上,我希望输出用数据文件生成的相应散列json替换散列中特定键的值。

在查看可用的过滤器和运算符之后,我认为答案将在于捕获两个散列集的输出,然后使用替换过滤器将相应数据文件的值替换为原始散列集中的键值。

如果有人没有打败我,我会在我弄清楚的时候发一个答案 - 但我现在还有其他东西在我的盘子里。

3 个答案:

答案 0 :(得分:1)

这个答案是hacky(不优雅),但它完成了工作,如果没有提供更清洁的解决方案,我在这里发布。

问题:我的目标是以json格式输出散列,但用数据文件中的值替换特定值。

我无法在输出之前找到操纵数据的方法。相反,我采取了捕获相关字符串输出的过程,然后使用替换过滤器来替换值。

第一步:要更换的捕获值(选择性关键)

我以json格式捕获了我想要替换的值。我手动插入了json格式的密钥,如果哈希中其他密钥的值中存在相同字符串的其他实例:

{% capture articleAuthorNameValue %}
"author":"{{ page.article.author }}"
{% endcapture %}

第二步:捕获替代值

自我解释但是再次记得使用jsonify过滤器,因为您要替换以json格式表示的值。

{% capture articleAuthorNameSubstituteValue %}
{{ site.data.person[page.article.author] | jsonify }}
{% endcapture %}

第三步: OUTPUT&替代

将值输出为json并替换捕获的值。

{{ page.article | jsonify | replace: articleAuthorNameValue, articleAuthorNameSubstituteValue }}

正如我暗示的那样 - 非常难看,但完成了工作。

答案 1 :(得分:0)

首先,我不确定为什么你的前面是

---
article:
  name: An article
  date: some date
  author: Tim
---

而不是

---
name: An article
date: some date
author: Tim
---

我将使用第二种形式,因为它需要更短的表达式来从中获取数据。例如:page.article.author vs page.author

您的数据文件也未经过验证。一个正确的形式是:

Tim:
  firstName: Tim
  surname: Bradley
  occupation: coffee consumer

Bob:
  firstName: Robert
  surname: De Niro
  occupation: Taxi Driver

现在,当您想要从帖子或页面数据访问作者的数据时,您没有义务按作者数据替换作者密钥。您只需从密钥中提取作者数据:

{% for post in site.posts %}
  <h1>{{ post.title }}</h1>

  # creating a new variable containing an author object
  {% assign author = site.data.authors[post.author] %}

  # if we have found an author
  {% if author %}
    <p>{{ author.firstName }} {{ author.surname }}</p>
  {% endif %}

{% endfor %}

答案 2 :(得分:0)

您可以使用自定义的Jekyll过滤器进行此操作。

将其/_plugins/放在replace_keys.rb

module Jekyll
  module ReplaceKeysFilter
    
    def replace_keys(input, *keys)
      begin
        keys = [] if keys.to_a.empty?
        if input.is_a?(Hash)
          return _replace_keys(input, keys)
        elsif input.is_a?(Jekyll::Drops::DocumentDrop)
          return _replace_keys(input.hash_for_json(), keys)
        else
          "Error: Unhandled class type #{input.class}"
        end
      rescue => e
        "Error: #{e}."
      end
    end

    private

    def _replace_keys(the_hash, keys)
      i = 0
      until i + 2 > keys.length
        k = keys[i]
        v = keys[i+1]
        the_hash[k] = v if the_hash.key?(k)
        i += 2
      end
      return the_hash
    end
    

  end
end

Liquid::Template.register_filter(Jekyll::ReplaceKeysFilter)

然后使用模板中的过滤器从对象中删除一个或多个键。

用法示例

替换content对象的post

<pre>{{ post | replace_keys: "content", "new content" | pretty_json }}</pre>

替换content对象的outputpost

<pre>{{ post | replace_keys: "content", "new content", "output", "new output" | pretty_json }}</pre>