newtonsoft.JSON정리

김동운·2024년 12월 12일

유니티

목록 보기
8/11


게임을 개발하다보면 대사나 인벤토리 상태등을 저장할때가있다.
클래스에 넣어두기엔 껏다키면 데이터는 날라갈꺼고 데이터베이스를 쓰기엔 좀 ,, 많이 일이커질수가있다
그렇다면 뭐 json이나 csv, 아니면 엑셀등을 사용할수도있다 그중 json에 대해 정리해보면 다음과 같다

데이터 타입 종류

  • JToken

  • JObject

  • JArray

  • JValue

    사실 JProperty나 JConstructor도 있긴한데 난 솔직히 쓸일이없다 생각한다, 어짜피 오브젝트쪽에서 왠만하면 해결된다.
    JArray도 사실 foreach문써서 오브젝트 내 값 순환시켜도되는지라...

    그래서 일단 많이쓰는 토큰이랑 오브젝트만 정리해본다.

JToken

{
    "npcs": [
      {
        "id": "testNpc",
        "dialogs": 
        {
          "start": 
          {  
            "first_visit"  : ["안녕?, 반가워!","이건 일단 테스트야.","어째뜬 잘 작동은 하네!","근데 이제뭐해?"], 
            "return_visit" : ["그래도 대사 스크립트는 잘 작동하네!","그러면 된거겠지?!"]
          },
          "end": 
          {
            "event_clear_visit": ["상호 작용테스트야.","성공은 했어!","이제 버그잡아야지"]
          }
        }
      },

      {
        "id": "2",
        "dialogs": {
          
        }
      },

      {
        "id": "3",
        "dialogs": {
          "greeting": ["Ah, a new face!", "Hello there!"],
          "trade": ["I have rare items for sale.", "Take a look at my goods."],
          "farewell": ["Come back anytime.", "Don't be a stranger."]
        }
      }
    ]
}
  
  • 기본적으로 JSON 데이터의 기본 단위. 모든 JSON 데이터 타입을 가지고있다. 최상위 구조로서 주로 탐색이나 추상적 처리에 유용하다 .
    • (JObject, JArray, JValue 등)의 부모 클래스이다 즉 밑에있는 데이터타입은 토큰을 이용해서 형변환이 가능하다.
    • 구조탐색쪽에 유리하다 다층구조 json의 경우 모두 하나씩 찾는거보다 특정 id를 지정해서 그쪽으로 들어갈수있다.

JObject

{
  "dialogs": {
    "start": {
      "first_visit": ["안녕?, 반가워!","이건 일단 테스트야.","어째뜬 잘 작동은 하네!","근데 이제뭐해?"],
      "return_visit": ["그래도 대사 스크립트는 잘 작동하네!","그러면 된거겠지?!"]
    },
    "end": {
      "event_clear_visit": ["상호 작용테스트야.","성공은 했어!","이제 버그잡아야지"]
    }
  }
}
  • JSON 객체({ "key": "value" })를 표현한다
    • JSON 객체는 JObject 클래스에 의해 표현되며, 이 클래스는 여러 개의 JProperty 객체들을 포함한다,
      각 JProperty는 키와 값을 한 쌍으로 가지고 있다
    • 또한 키 는 string만 가능하지만 값의경우는 JValue(원시 데이터), JObject(중첩된 객체), JArray(배열), JToken(동적 데이터) 등 다양한 데이터 타입을 가질 수 있다.

이제 제일많이쓰는 오브젝트에 대해 몇가지 사용방법에 대해 설명하면 다음과 같다.
예를들어 토큰에서

var dialogsValue = (JObject)keyName.Value;

이런식으로 내부에있는 오브젝트를 가져왔다 치자.
내부의 값을 가져올려면 일단 그 오브젝트의 키를 가지고 그 값에 맞는걸 받아오면된다.
방법은 여러가지있는데, 만약 저위에있는 구조처럼 내부에 중첩된 구조라면 이름 하나하나씩써가면서 할바엔 순환시키는 방법도있다.

foreach (var v in (JObject)dialogsValue)// 해당키의 json 내부 저장된 배열 순회
                { 
                    output.Add((keyName.Key, v.Value.ToObject<string[]>()));
                }

이런방식으로꺼낼수있다. 내부는 딱히 신경안써도된다. 이방법은 한번에 데이터배열을 다빼내는게아니라 튜플리스트로 넣기위해 있는구조다.

아니면 뭐 한번에 꺼낼수도있다.

var data = (JObject)dialogsValue)[dialogs];

이런식으로 값을 한번에 빼내는 방법도있다 키값만 안다면 그 층에있는쪽에서 맞는키를 찾고 그 값을 가져온다.

아니면 JArray써도된다.

0개의 댓글