# JSON 직렬화

> Convert Unity objects to and from JSON format using the JsonUtility class.

[JsonUtility](/engine/6000.0/script-reference/unity-engine/json-utility.md) 클래스를 사용하여 Unity 오브젝트를 [JSON](http://www.json.org) 포맷으로 전환합니다. 예를 들어 JSON 직렬화를 사용하여 웹 서비스와 상호 작용하거나 텍스트 기반 포맷으로 데이터를 쉽게 패킹 및 언패킹할 수 있습니다.

JSON 직렬화는 ‘구조화된’ JSON 개념을 사용합니다. 즉 JSON 데이터에 저장하려는 변수를 설명하는 클래스 또는 구조를 만들어야 합니다. 예시:

```
[Serializable]
public class MyClass
{
	public int level;
	public float timeElapsed;
	public string playerName;
}
```

세 가지 변수(**level**, **timeElapsed**, **playerName**)가 포함된 플레인 C# 클래스를 정의하고 `Serializable` 속성으로 표시하여 JSON 시리얼라이저와 연동되도록 만듭니다. 클래스의 인스턴스를 생성하려면 다음을 사용하면 됩니다.

```
MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
```

그런 다음 [JsonUtility.ToJson](/engine/6000.0/script-reference/unity-engine/json-utility/to-json.md) 메서드를 사용하여 JSON 포맷으로 직렬화(전환)합니다.

```c#
string json = JsonUtility.ToJson(myObject);
// json now contains: '{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}'
```

JSON을 다시 오브젝트로 전환하려면 [JsonUtility.FromJson](/engine/6000.0/script-reference/unity-engine/json-utility/from-json.md)을 사용합니다.

```
myObject = JsonUtility.FromJson<MyClass>(json);
```

그러면 새 `MyClass`의 인스턴스가 생성되고 JSON 데이터를 사용하여 값이 설정됩니다. JSON 데이터에 `MyClass`의 필드에 매핑되지 않는 값이 포함된 경우, 시리얼라이저는 해당 값을 무시합니다. JSON 데이터에 `MyClass`의 필드에 대한 값이 누락된 경우, 시리얼라이저는 반환된 오브젝트에 해당 필드에 대한 구성된 값을 남깁니다.

## JSON으로 오브젝트 덮어쓰기##overwriting-objects-with-json

기존 오브젝트에 대해 JSON 데이터를 역직렬화하여 기존 데이터를 모두 덮어쓸 수도 있습니다.

```
JsonUtility.FromJsonOverwrite(json, myObject);
```

JSON 데이터에 필드에 대한 값이 없는 경우, 시리얼라이저는 해당 필드의 값을 변경하지 않습니다. 이 메서드를 사용하면 이전에 생성한 오브젝트를 재사용하여 할당을 최소화할 수 있습니다. 또한 약간의 필드 하위 집합만 포함하는 JSON으로 의도적으로 오브젝트를 덮어쓰는 방식으로 오브젝트를 ‘패치’할 수도 있습니다.

**경고:** JSON Serializer API는 [MonoBehaviour](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md) 및 [ScriptableObject](/engine/6000.0/script-reference/unity-engine/scriptable-object.md) 서브 클래스뿐만 아니라 일반 구조체 및 클래스를 지원합니다. 그러나 JSON을 `MonoBehaviour` 또는 `ScriptableObject`의 서브 클래스로 역직렬화할 때는 [FromJsonOverwrite](/engine/6000.0/script-reference/unity-engine/json-utility/from-json-overwrite.md) 메서드를 사용해야 합니다. [FromJson](/engine/6000.0/script-reference/unity-engine/json-utility/from-json.md)을 사용하려고 하면 이 동작이 지원되지 않기 때문에 Unity가 예외를 발생시킵니다.

## 지원되는 유형##supported-types

JSON Serializer API는 `[Serializable]` 속성을 가진 모든 `MonoBehaviour` 서브 클래스, `ScriptableObject` 서브 클래스 또는 일반 클래스 또는 구조체를 지원합니다. 프로세싱을 위해 표준 Unity 시리얼라이저에 오브젝트를 전달하면 인스펙터와 동일한 규칙과 제한이 적용됩니다. Unity는 필드만 직렬화하며, `Dictionary<>` 같은 유형은 지원되지 않습니다.

Unity는 기본 유형이나 배열 등 다른 유형을 API에 직접 전달하는 기능을 지원하지 않습니다. 이들을 전환해야 하는 경우, `class` 또는 `struct`로 래핑하십시오.

에디터의 경우에 한정하여, 병렬 API인 [EditorJsonUtility](/engine/6000.0/script-reference/unity-editor/editor-json-utility.md)를 사용하면 [UnityEngine.Object](/engine/6000.0/script-reference/unity-engine/object.md)에서 파생된 모든 오브젝트를 JSON으로 직렬화하거나 JSON으로부터 직렬화할 수 있습니다. 그러면 오브젝트의 YAML 표현과 동일한 데이터가 포함된 JSON이 생성됩니다.

[JsonUtility](/engine/6000.0/script-reference/unity-engine/json-utility.md) 및 [EditorJsonUtility](/engine/6000.0/script-reference/unity-editor/editor-json-utility.md)는 [Unity 직렬화 규칙](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-serialization.md#SerializationRules)을 사용하여 오브젝트를 JSON 문자열 포맷으로 직렬화하거나 그 반대로 직렬화하는 유틸리티 클래스입니다. 코드를 통해 JSON 데이터를 조작하거나 Unity의 직렬화가 지원하지 않는 데이터 구조를 직렬화해야 하는 경우 일반 용도 .NET JSON 라이브러리를 JsonUtility API 컴패니언으로 사용하면 됩니다.

## 성능##performance

벤치마크 테스트에 따르면 [JsonUtility](/engine/6000.0/script-reference/unity-engine/json-utility.md)는 일부 경우 더 적은 기능을 제공함에도 불구하고 인기 있는 .NET JSON 솔루션보다 훨씬 더 빠른 성능을 자랑합니다.

GC(가비지 컬렉션)는 최소의 메모리를 사용합니다.

* [ToJson](/engine/6000.0/script-reference/unity-engine/json-utility/to-json.md)은 반환된 문자열에만 GC 메모리를 할당합니다.
* [FromJson](/engine/6000.0/script-reference/unity-engine/json-utility/from-json.md)은 반환된 오브젝트와 필요한 하위 오브젝트에만 GC 메모리를 할당합니다. 예를 들어 배열이 포함된 오브젝트를 역직렬화하면 배열을 위한 GC 메모리가 할당됩니다.
* [FromJsonOverwrite](/engine/6000.0/script-reference/unity-engine/json-utility/from-json-overwrite.md)는 작성된 필드(예: 문자열, 배열)에 필요한 경우에만 GC 메모리를 할당합니다. 즉, JSON이 덮어쓰는 모든 필드가 값 유형인 경우 Unity는 GC 메모리를 할당하지 않습니다.

백그라운드 스레드에서 JsonUtility API를 사용할 수 있습니다. 하지만 다른 멀티스레드 코드와 마찬가지로, 다른 스레드에서 오브젝트를 직렬화하거나 역직렬화하는 동안에는 해당 오브젝트를 수정하거나 액세스하지 않도록 주의하십시오.

## ToJson()의 출력 제어##controlling-the-output-of-tojson()

[ToJson](/engine/6000.0/script-reference/unity-engine/json-utility/to-json.md) 메서드는 JSON 출력을 읽기 쉽게 만드는 기능을 지원합니다. 기본적으로 꺼져 있지만 `true`를 두 번째 파라미터로 전달하여 활성화할 수 있습니다.

`[NonSerialized]` 속성을 사용하여 필드를 출력에서 생략할 수 있습니다.

## 알 수 없는 유형의 FromJson() 사용##using-fromjson()-with-unknown-types

오브젝트 유형을 미리 알 수 없는 경우 JSON을 ‘common’ 필드가 포함된 클래스나 구조체로 역직렬화한 후 해당 필드의 값을 사용하여 원하는 실제 유형을 파악할 수 있습니다. 그런 다음 해당 유형으로 다시 역직렬화합니다.
