2017-10-09 4 views
0

ネストされたJSONレスポンスでURLを探してマップしようとしています。 My機能は、これまでのようになります。URLは任意のキーを持っているし、任意のレベルでできるようにElixir:ネストされたJSONの値プリフィックスを検索

"stacks": [ 
    { 
     "boxes": [ 
     { 
      "content": "https://ddd.cloudfront.net/photos/uploaded_images/000/001/610/original/1449447147677.jpg?1505956120", 
      "box": "photo" 
     } 
     ] 
    } 
    ], 
    "logo": "https://ddd.cloudfront.net/users/cmyk_banners/000/000/002/original/banner_CMYK.jpg?1397201875" 

def list(env, id) do 
    Service.get_document(env, id) 
    |> Poison.decode! 
    |> Enum.find(fn {_key, val} -> String.starts_with?(val, 'https') end) 
end 

JSONは、おおよそ次のようになります。そのコードで

私はこのエラーを取得する:

no function clause matching in String.starts_with?/2 

誰でもJSONレスポンスで見つけるためのより良い方法を得ましたか。

答えて

3

あなたはデータの3種類の処理する、このために再帰関数を使用する必要があります:マップについて

  1. を、それがそのすべての値の上に再帰します。
  2. リストの場合、すべての要素を再帰的に処理します。

    defmodule A do 
        def recursive_starts_with(thing, start, acc \\ []) 
    
        def recursive_starts_with(binary, start, acc) when is_binary(binary) do 
        if String.starts_with?(binary, start) do 
         [binary | acc] 
        else 
         acc 
        end 
        end 
        def recursive_starts_with(map, start, acc) when is_map(map) do 
        Enum.reduce(map, acc, fn {_, v}, acc -> A.recursive_starts_with(v, start, acc) end) 
        end 
        def recursive_starts_with(list, start, acc) when is_list(list) do 
        Enum.reduce(list, acc, fn v, acc -> A.recursive_starts_with(v, start, acc) end) 
        end 
    end 
    
    data = %{ 
        "stacks" => [ 
        %{ 
         "boxes" => [ 
         %{ 
          "content" => "https://ddd.cloudfront.net/photos/uploaded_images/000/001/610/original/1449447147677.jpg?1505956120", 
          "box" => "photo" 
         } 
         ] 
        } 
        ], 
        "logo" => "https://ddd.cloudfront.net/users/cmyk_banners/000/000/002/original/banner_CMYK.jpg?1397201875" 
    } 
    
    data |> A.recursive_starts_with("https") |> IO.inspect 
    

    出力:

    ["https://ddd.cloudfront.net/photos/uploaded_images/000/001/610/original/1449447147677.jpg?1505956120", 
    "https://ddd.cloudfront.net/users/cmyk_banners/000/000/002/original/banner_CMYK.jpg?1397201875"] 
    
    文字列の場合
  3. が、それはここで

starts_with?に確認する用語や文字列を受け入れ、単純な実装だ "HTTPS" で始まる文字列を選択し、

+0

これは非常に魅力的なものです。再び。 –

関連する問題