【问题标题】:How To Create Generic JSON Parsing Code?如何创建通用 JSON 解析代码?
【发布时间】:2014-10-04 00:35:17
【问题描述】:

所以我正在解析一个通过使用jsx 解析一些 json 返回的列表。我通过搜索具有特定名称的元组来提取一些选定的值,如下所示:

defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""

我正在对要提取的几个单独元素执行相同的操作,当我看到大量仅在一个参数上有所不同的代码时,我闻到了不好的代码气味。我的意思是这样的代码:

defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""

defp get_last_updated([{"last updated",_last_updated | _t]), do: _last_updated
defp get_last_updated([_h | _t]), do: get_last_updated(_t)
defp get_last_updated([]), do: ""

defp get_creator([{"creator",_creator} | _t]), do: _creator
defp get_creator([_h | _t]), do: get_creator(_t)
defp get_creator([]), do: ""

我闻到了违反 DRY 原则的味道。

所以我想我可以这样做:

defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
defp get_json_element([_h | _t]), do: get_json_element(_t)
defp get_json_element([]), do: ""

但是假设这会起作用(它可以编译,但我不确定它会做我想要的),我该如何称呼它?我不能调用get_json_element(["link", _link])(或者至少我不认为我可以)我的意思是通常我会将 jsx.decode 返回的列表传递给各种 get_X 函数,但是我如何传递模式匹配表达式?对不起——我认为我的问题表述得不是很好,但我不知道如何更好地表述它。

这是我应该使用宏来减少重复代码的情况之一吗?如果有,有没有人写过这种宏?

还想知道是否有更好的方法来指示空字符串。使用 "" 对我来说似乎不是最好的方法。或者我可以返回另一个值吗?也许返回 nil?

【问题讨论】:

    标签: json parsing elixir


    【解决方案1】:

    你绝对可以使用宏

    你可以使用https://github.com/Licenser/jsxd库来操作jsx返回的数据结构

    你可以使用一个通用函数,比如

    def get(json, key, default \\ nil) do                                                                            
      case List.keyfind(json, key, 0, default) do
        {^key, value} -> value
        ^default -> default
      end 
    end 
    

    您的解决方案

    defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
    defp get_json_element([_h | _t]), do: get_json_element(_t)
    defp get_json_element([]), do: ""
    

    不起作用,因为{element_to_get, value_of_element} 将匹配任何具有相同形状的元组{_, _}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多