Elixir에서 JSON 데이터를 처리하는 방법은?
_____A1: Elixir에서는 주로 `Jason` 라이브러리를 사용하여 JSON 데이터를 인코딩(encoding) 및 디코딩(decoding)합니다. 이외에도 `Poison` 라이브러리도 많이 사용됩니다.
Q2: `Jason` 라이브러리를 프로젝트에 어떻게 추가하나요?
A2: `mix.exs` 파일에 다음 의존성을 추가합니다.
```elixir
defp deps do
[
{:jason, "~> 1.4"}
]
end
```
그 후 `mix deps.get` 명령어로 설치합니다.
Q3: JSON 문자열을 Elixir 데이터 구조로 어떻게 변환하나요?
A3: `Jason.decode/1` 함수를 사용합니다.
예:
```elixir
{:ok, data} = Jason.decode("{\"name\":\"Alice\",\"age\":30}")
```
`data`는 맵(`%{"name" => "Alice", "age" => 30}`) 형태입니다.
Q4: Elixir 데이터 구조를 JSON 문자열로 변환하는 방법은?
A4: `Jason.encode/1` 함수를 사용합니다.
예:
```elixir
{:ok, json} = Jason.encode(%{"name" => "Alice", "age" => 30})
```
`json` 변수는 `"{"name":"Alice","age":30}"` 형태의 JSON 문자열이 됩니다.
A5: `Jason.decode/1`은 `{:ok, data}` 또는 `{:error, reason}` 튜플을 반환합니다.
따라서 패턴 매칭으로 오류를 처리할 수 있습니다.
```elixir
case Jason.decode(json_string) do
{:ok, data} -> IO.inspect(data)
{:error, reason} -> IO.puts("디코딩 실패: {reason}")
end
```
Q6: JSON 인코딩 시 옵션을 줄 수 있나요?
A6: 네, `Jason.encode/2`에 옵션을 넘길 수 있습니다. 예를 들어, pretty-print 옵션:
```elixir
Jason.encode(data, pretty: true)
```
Q7: Map 키가 atom일 때 JSON 인코딩 시 주의할 점은?
A7: `Jason.encode/1`은 기본적으로 atom 키를 문자열 키로 인코딩합니다. 만약 atom 키가 아니라면 오류가 날 수 있으니, 반드시 atom 키인지를 확인하거나 `Jason` 옵션에서 `keys: :atoms` 등 커스텀 처리를 해야 합니다.
Q8: Phoenix 프레임워크에서 JSON 응답을 쉽게 보내는 방법은?
A8: Phoenix 컨트롤러에서 `json(conn, data)` 함수가 기본으로 지원됩니다. 내부에서 `Jason` 등을 사용해 자동으로 JSON으로 변환해 클라이언트에 보냅니다.
Q9: JSON 배열을 디코딩하면 어떤 자료형으로 반환되나요?
A9: JSON 배열은 Elixir 리스트로 변환됩니다. 예: `"[1,2,3]"` → `[1, 2, 3]`.
Q10: JSON 처리 시 성능 이슈가 있나요?
A10: `Jason`은 빠른 JSON 라이브러리로 널리 쓰이며, 보통 성능 문제가 없습니다. 대규모 데이터를 다룰 때는 스트리밍 처리가 가능한 다른 라이브러리도 고려할 수 있습니다.
---
위 FAQ는 Elixir에서 JSON 데이터를 인코딩, 디코딩하고 처리하는 주요 방법과 주의사항을 다룹니다.
이 두 라이브러리는 JSON 인코딩 및 디코딩을 위한 기능을 제공합니다.
여기서는 `Jason`을 중심으로 설명하겠습니다.
`Jason`은 Elixir에서 가장 널리 사용되는 JSON 라이브러리로, 성능이 뛰어나고 사용하기 간편합니다.
1. Jason 설치하기 Elixir 프로젝트에서 `Jason`을 사용하려면 먼저 `mix.exs` 파일에 의존성을 추가해야 합니다.
다음과 같이 `deps` 함수에 `:jason`을 추가합니다.
```elixir defp deps do [ {:jason, "~> 1.2"} ] end ``` 그런 다음, 의존성을 설치합니다.
```bash mix deps.get ```
2. JSON 인코딩 Elixir의 데이터 구조를 JSON 문자열로 변환하려면 `Jason.encode/1` 함수를 사용합니다.
예를 들어, 맵을 JSON으로 인코딩하는 방법은 다음과 같습니다.
```elixir data = %{name: "Alice", age: 30, city: "Wonderland"} json_string = Jason.encode!(data) IO.puts(json_string) 출력: {"name":"Alice","age":30,"city":"Wonderland"} ``` `Jason.encode/1` 함수는 JSON 문자열을 반환하며, `!`가 붙지 않은 버전은 `{:ok, json_string}` 또는 `{:error, reason}` 튜플을 반환합니다.
3. JSON 디코딩 JSON 문자열을 Elixir의 데이터 구조로 변환하려면 `Jason.decode/1` 함수를 사용합니다.
예를 들어, JSON 문자열을 맵으로 디코딩하는 방법은 다음과 같습니다.
```elixir json_string = "{\"name\":\"Alice\",\"age\":30,\"city\":\"Wonderland\"}" {:ok, data} = Jason.decode(json_string) IO.inspect(data) 출력: %{"name" => "Alice", "age" => 30, "city" => "Wonderland"} ``` 마찬가지로, `Jason.decode!/1` 함수를 사용하면 예외를 발생시키며, 성공적으로 디코딩된 경우에는 데이터 구조를 반환합니다.
4. JSON 옵션 `Jason.encode/2`와 `Jason.decode/2` 함수는 추가적인 옵션을 받을 수 있습니다.
예를 들어, JSON 문자열을 예쁘게 출력하고 싶다면 `pretty: true` 옵션을 사용할 수 있습니다.
```elixir json_string = Jason.encode!(data, pretty: true) IO.puts(json_string) ```
5. 커스텀 인코더 및 디코더 Elixir에서는 커스텀 데이터 구조를 JSON으로 인코딩하거나 디코딩하기 위해 `Jason.Encoder`와 `Jason.Decoder`를 구현할 수 있습니다.
예를 들어, 다음과 같이 사용자 정의 구조체를 JSON으로 인코딩할 수 있습니다.
```elixir defmodule User do defstruct name: "", age: 0 defimpl Jason.Encoder do def encode(%User{name: name, age: age}, opts) do Jason.Encode.map(%{"name" => name, "age" => age}, opts) end end end user = %User{name: "Alice", age: 30} json_string = Jason.encode!(user) IO.puts(json_string) 출력: {"name":"Alice","age":30} ```
6. 에러 처리 JSON 인코딩 및 디코딩 과정에서 발생할 수 있는 에러를 처리하는 것이 중요합니다.
예를 들어, 잘못된 JSON 문자열을 디코딩하려고 할 때는 `Jason.decode/1`이 `{:error, reason}`을 반환합니다.
이를 통해 에러를 적절히 처리할 수 있습니다.
```elixir case Jason.decode(invalid_json_string) do {:ok, data} -> IO.inspect(data) {:error, reason} -> IO.puts("Error decoding JSON: {reason}") end ``` 결론 Elixir에서 JSON 데이터를 처리하는 것은 `Jason` 라이브러리를 통해 간단하고 효율적으로 수행할 수 있습니다.
JSON 인코딩 및 디코딩, 커스텀 인코더 및 디코더 구현, 에러 처리 등을 통해 다양한 JSON 관련 작업을 수행할 수 있습니다.
이러한 기능들은 API와의 상호작용, 데이터 저장 및 전송 등 다양한 상황에서 유용하게 사용될 수 있습니다.
작성자:
정수영 [비회원]
| 작성일자: 1년 전
2025-01-02 06:21:35
조회수: 174 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 174 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.