보통 c#에서 json파싱을 위해 [Newtonsoft.Json]을 많이 사용하곤 한다. 그런데 안드로이드 빌드 후 테스트 할 때, IL2CPP 컴파일 부분에서 에러가 발생한다

 

"Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types"

 

위 문제를 해결된 파서가 없을까 하고 검색 해 보니, [Json.Net for Unity]라는 곳에서 해당 문제를 해결해 배포하고 있었다.

 

1. 설치

 

 

우선 패키지 매니저를 통해서, 설치하자. 이걸로 끝은 아니다. 지금 패키지 매니저에 올라간 버전은 아까 위의 문제가 해결된 버전이 아니다. 때문에 [프로젝트폴더/Packages/manifest.json]을 열어 해결된 버전으로 설치 해줘야 한다.

https://github.com/jilleJr/Newtonsoft.Json-for-Unity/issues/3

관련 이슈는 위 링크를 참고 하면 된다.

 

{
  "scopedRegistries": [
    {
      "name": "Packages from jillejr",
      "url": "https://registry.npmjs.org/",
      "scopes": [
        "jillejr"
      ]
    }
  ],
  "dependencies": {
    "com.unity.package-manager-ui": "2.1.2",
-    "jillejr.newtonsoft.json-for-unity": "12.0.1",
+    "jillejr.newtonsoft.json-for-unity": "12.0.1-patch-001",
    "com.unity.modules.ai": "1.0.0",
    "com.unity.modules.animation": "1.0.0",
    "com.unity.modules.assetbundle": "1.0.0",
    "com.unity.modules.audio": "1.0.0",
    "com.unity.modules.cloth": "1.0.0",
    }
  }

 

위 "dependencies"에서 

["jillejr.newtonsoft.json-for-unity": "12.0.1-patch-001"] 으로 바꿔주자.

 

2. 사용 예

 아래는 그냥 파싱하는 부분의 예시이다.

private void parseMonsterDataJson(string json_str)
{
    if(String.IsNullOrEmpty(json_str))
        return;


    JObject json_object 		= JObject.Parse(json_str);
    JObject version_token 		= (JObject)json_object["version"];

    m_version_array[(int)SystemDataType.SYS_DATA_MONSTER] = (int)version_token["version"];

    m_monster_data_list.Clear();
    foreach(JObject item in (JArray)json_object["monster"])
        makeMonsterData(m_monster_data_list, item);

}

private void makeMonsterData(Dictionary<MonsterType,MonsterData> parent, JObject item)
{
    MonsterData data 		= new MonsterData();

    data.m_id				= (int)item["id"];
    if(!Enum.TryParse<MonsterType>((string)item["type"],out data.m_type))
        LogManager.Debug("MonsterData Error, "+(string)item["type"]+" is failed");
    data.m_name				= (string)item["name"];
    data.m_desc				= (string)item["desc"];
    data.m_bal_id			= (int)item["bal_id"];
    data.m_skill_id_1		= (int)item["skill_id_1"];
    data.m_skill_id_2		= (int)item["skill_id_2"];
    data.m_skill_id_3		= (int)item["skill_id_3"];
    data.m_reward_id_1		= (int)item["reward_id_1"];
    data.m_reward_id_2		= (int)item["reward_id_2"];
    data.m_reward_id_3		= (int)item["reward_id_3"];
    data.m_reward_id_4		= (int)item["reward_id_4"];
    data.m_reward_id_5		= (int)item["reward_id_5"];
    data.m_reward_id_6		= (int)item["reward_id_6"];


    parent[data.m_type] 	= data;
}

 

 

 

 

 

 

 

 

 

 

이세계 용병 온라인

댓글을 달아 주세요