0Pricing
Scala for Backend Engineering & Functional Programming · 강의

JSON으로 인코딩하기

데이터를 직렬화해 내보내 보세요.

JSON으로 인코딩하기은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Encoders Produce JSON

An Encoder[A] is the dual of a decoder: it turns a Scala value of type A into a Circe Json tree.

From there you serialize to a String for HTTP responses, logs, or storage.

The asJson Syntax

Import io.circe.syntax._ to get the .asJson extension method on any value that has an Encoder in scope.

Primitives and collections work immediately.

import io.circe.syntax._

println(42.asJson.noSpaces)        // 42
println("hi".asJson.noSpaces)      // "hi"
println(List(1,2,3).asJson.noSpaces)  // [1,2,3]

Deriving Encoders

Just like decoders, encoders for case classes are derived. Import io.circe.generic.auto._ for automatic derivation.

Field names become JSON keys and field values are encoded recursively.

import io.circe.generic.auto._
import io.circe.syntax._

case class User(name: String, age: Int)
println(User("Ada", 36).asJson.noSpaces)
// {"name":"Ada","age":36}

Semi-Automatic Encoders

For explicit, reusable instances use deriveEncoder from io.circe.generic.semiauto.

Placing it in the companion object gives you one shared Encoder[User] across the codebase.

import io.circe.Encoder
import io.circe.generic.semiauto._

object User {
  implicit val enc: Encoder[User] = deriveEncoder[User]
}

Building Json by Hand

You can construct JSON directly with Json.obj and key/value pairs, where values use .asJson.

This is handy for ad-hoc shapes that do not map to a case class.

import io.circe.Json
import io.circe.syntax._

val j = Json.obj(
  "ok" -> true.asJson,
  "count" -> 3.asJson
)
println(j.noSpaces)  // {"ok":true,"count":3}

Encoding Options

An Option[A] field encodes Some(x) as the value and None as JSON null by default.

If you would rather omit null keys entirely, you can drop them after encoding, shown later.

case class Account(id: Long, nick: Option[String])
println(Account(7, None).asJson.noSpaces)
// {"id":7,"nick":null}

Dropping Null Values

To omit nulls, transform the resulting Json with .deepDropNullValues.

This recursively removes keys whose value is null, producing cleaner output for optional fields.

val clean = Account(7, None).asJson.deepDropNullValues
println(clean.noSpaces)
// {"id":7}

Pretty Printing Output

Use .spaces2 or .spaces4 for indented, human-readable JSON, and .noSpaces for compact wire format.

For full control over formatting, build a custom Printer.

import io.circe.Printer

val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))

Encoding Maps

A Map[String, A] encodes to a JSON object, with map keys becoming JSON keys.

For non-string key types, you must provide a KeyEncoder that renders the key as text.

import io.circe.syntax._

val scores = Map("ada" -> 90, "alan" -> 85)
println(scores.asJson.noSpaces)
// {"ada":90,"alan":85}

Mapping Over Encoders

You can adapt an existing encoder with contramap: supply a function from your type to a type Circe already encodes.

This avoids writing a full encoder from scratch.

import io.circe.Encoder

case class UserId(value: Long)
implicit val enc: Encoder[UserId] =
  Encoder[Long].contramap(_.value)

Encode and Decode Together

When you need both directions, derive a single Codec[A] with deriveCodec, which bundles an encoder and a decoder.

This keeps the two in sync as the case class evolves.

import io.circe.Codec
import io.circe.generic.semiauto._

implicit val codec: Codec[User] = deriveCodec[User]

Quick Check

Test your understanding of encoding to JSON.

Recap

An Encoder[A] turns Scala values into Json. Use .asJson with derived encoders, or build trees with Json.obj.

None becomes null unless you drop it; contramap reuses encoders; deriveCodec bundles both directions.

자주 묻는 질문

“JSON으로 인코딩하기” 강의는 무료인가요?

네 — “JSON으로 인코딩하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“JSON으로 인코딩하기”에서 뭘 배우나요?

데이터를 직렬화해 내보내 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“JSON으로 인코딩하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JSON 구문 분석
  2. 케이스 클래스으로 디코딩하기
  3. JSON으로 인코딩하기
  4. 사용자 지정 코덱
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기