Splunk에서 은근 json 데이터를 많이 다루게 되는데, 이때 무조건 json 관련 함수를 쓰게된다. 쓸 때마다 찾아봐야해서 블로그에 정리해두려고 한다.
일단 공식 홈페이지에 가보면 json 과 관련된 함수가 11개나 있다. 각기 사용 방법이 다른데, 비슷한듯 하면서도 다르다.
1탄과 2탄을 나눠서 쓰는데, 2탄에서는 json 배열과 관련된 함수와 json 정보를 다루는 함수에 대해서 설명한다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data_new = json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek")
이 쿼리에서는 movies.genres.sci-fi.space travel
에 Star Trek 이라는 value를 추가했다. 결과는 다음과 같이 나온다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data_new = json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek","movies.genres.sci-fi.time travel","Primer")
동시에 여러개를 추가할 수도 있다. 이번에는 기존에 추가했던 내용에 movies.genres.sci-fi.time travel
경로에 Primer이라는 값을 추가했다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data= json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek","movies.genres.sci-fi.time travel","Primer")
| eval json_data_new = json_append(json_data, "movies.genres.sci-fi.space travel", json_array("Star Trek", "Avengers"), "movies.genres.sci-fi.time travel", "Primer")
이렇게 movies.genres.sci-fi.space travel
경로에 json_array("Star Trek", "Avengers") 를 추가해줬고, 결과는 다음과 같다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data= json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek","movies.genres.sci-fi.time travel","Primer")
| eval json_data_new = json_extend(json_data, "movies.genres.sci-fi.space travel", json_array("Star Trek", "Avengers"), "movies.genres.sci-fi.time travel", "Primer")
json_array("Star Trek", "Avengers") 를 추가했고, 이를 1차원으로 확장시켜 준다.
다음과 같은 데이터처럼 개행문자로 나뉘어진 multiline 데이터를 한번에 배열로 추가할 수 있다.
개행 문자로 이뤄진 변수를 space_travel_movies 라고 하면, mv_to_json_array를 이용해 배열로 추출했다.
| makeresults
| eval space_travel_movies = mvappend("Star Mars", "Interstellar", "Moon")
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", mv_to_json_array(spave_travel_movies)))))
결과는 다음과 같다.
유효하지 않은 JSON 데이터를 전송하게 되면 웹서버에서 오류코드를 응답으로 받게된다.
이때 미리 유효한지 확인 후에 전송할 수 있게끔 사용하는 용도로 적합하다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval is_valid = if(json_valid(json_data),"True","False")
json_valid 함수를 사용하면 된다.
json 객체의 키를 확인하고 싶다. json_keys를 사용하면 된다. 이때 주의할 점은 최상위 속성의 키값만 나오게 된다.
하위 속성의 키값을 보고싶으면 json_exact를 결합해서 사용해야한다.(특정 키 값에 대한 value 추출)
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval keys = json_keys(json_data)
특정 key 값에 대응되는 value를 추출할 때 사용된다.
다음과 같이 추출하려는 json객체, key경로를 사용해서 함수를 구성하면 된다.
json_extract(json_data,"movies.genres.sci-fi.space travel")
쿼리 전체를 확인하면 다음과 같다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval extracted_data = json_extract(json_data,"movies.genres.sci-fi.space travel")