unity study #2 - String을 JSON으로 변환하기

·2022년 8월 27일
0

Unity Study

목록 보기
2/8

문제 상황

json string 을 가져오고 json data를 원하는 key value 값을 얻을 수 있는 형태로 파싱 하고자 함. (JSON데이터를 저장하기위한 클래스를 미리 정의하지 않고 활용하는 방향으로 변환을 진행)

json 데이터

[
    {
        "name": "jay",
        "job": "student",
        "age": 23
    },
    {
        "name": "eun",
        "job": "student",
        "age": 22
    },
    {
        "name": "drew",
        "job": "developer",
        "age": 33
    },
    {
        "name": "coco",
        "job": "dog",
        "age": 2
    }
]

LoadJson()

private string LoadJson()
{
    var jsonPath = $"{Application.persistentDataPath}/{TESTJSON_FILENAME}";
    if (File.Exists(jsonPath))
    {
        string JsonString = File.ReadAllText(jsonPath);
        return JsonString;
    }
    else
    {
        return string.Empty;
    }
}

해결방법 1

JObject 타입의 Key, Value로 접근

string 형식의 JSON데이터를 JObject의 parse를 통해 JObject(json 객체)형태로 변환시켜 준다. 이후 key, value 를 불러온다.

문제상황 1

그러나 이 경우 동적으로 Key 값을 불러올 수 없고 JsonResult["name"], JsonResult.name과 같이 key값을 지정해야 불러올 수 있다. (가변적으로 Key 이름이 변경되는 경우라면 Key Name으로 직접 접근이 어렵다.)

문제상황 2

또 JObject 로 변환했을 때 Visual Code에서는 에러가 발생하지 않지만 Unity에서 JSON 데이터를 읽는것에 오류가 발생한다 . (JSON이 배열 형태여서 발생한 것으로 보여짐)

JsonReaderException: Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.

public class JsonList
{
    public string name { get; set; }
    public string job { get; set; }
    public string age { get; set; }
}

private void TestJson()
{
    var jsonString = LoadJson();
    JObject jsonstr = JObject.Parse(jsonString);
    for (var i = 0; i < jsonString.Length; i++)
    {
        var TestJsonResult = JsonConvert.DeserializeObject<JsonList>(jsonString[i].ToString());
        Debug.Log(" ## name : " + TestJsonResult.name);
        Debug.Log(" ## job : " + TestJsonResult.job);
        Debug.Log(" ## age : " + TestJsonResult.age);
    }
}

해결방법 2

JArray 타입의 Key, Value로 접근

JArray는 JObject와 유사하지만 좀 더 좁은의미이고, Key 없이 Value를 불러올 수 있다.

JSON형태가 배열인 상황이므로 JArray 를 통해 변환해야 함을 개발팀 OO님께서 찾아주셨다..!
JObject로 변환하던 부분을 JArray로 변경 후 에러가 사라졌고 정상적으로 Key, Value를 반복문을 통해 가져올 수 있게 되었다.

해결

JArray 형식으로 변환

JArray 형식을 일반 배열과 비슷하게 추출한다. Json 배열 추출 후 Dictionary<string, object> 형식으로 역직렬화 한다. ( Deserialize<Object>(string) )

Dictionary 형태의 jsonTableKeyValuePair 구조체를 활용하여 Key 와 Value 값을 얻는다.

public void TestJson()
{
    var jsonString = LoadJson();
    JArray jsonArr = JArray.Parse(jsonString); // Json 형식으로 변환
    foreach (var obj in jsonArr) // json 배열 추출
    {
        var jsonTable = (Dictionary<string, object>)Json.Deserialize(obj.ToString());
        foreach (KeyValuePair<string, object> item in jsonTable)
        {
            // 키값 : item.Key
            // 값 : item.Value
            Debug.Log("### Key : " + item.Key + ", Value : " + item.Value);
        }
    }
}

같이 볼 내용

Key 값만 얻음(Keys 속성)

public void TestJson()
{
    var jsonString = LoadJson();
    JArray jsonArr = JArray.Parse(jsonString);
    foreach (var obj in jsonArr)
    {
        var jsonTable = (Dictionary<string, object>)Json.Deserialize(obj.ToString());
        foreach (string item in jsonTable.Keys)
        {
            Debug.Log("### Key : " + item");
        }
    }
}

Value 값만 얻음(Values 속성)

public void TestJson()
{
    var jsonString = LoadJson();
    JArray jsonArr = JArray.Parse(jsonString);
    foreach (var obj in jsonArr)
    {
        var jsonTable = (Dictionary<string, object>)Json.Deserialize(obj.ToString());
        foreach (string item in jsonTable.Values)
        {
            Debug.Log("### Key : " + item");
        }
    }
}

Key 값을 통해 Value 값을 얻음

public void TestJson()
{
    var jsonString = LoadJson();
    JArray jsonArr = JArray.Parse(jsonString);
    foreach (var obj in jsonArr)
    {
        var jsonTable = (Dictionary<string, object>)Json.Deserialize(obj.ToString());
        var keystr = "age";

        Debug.Log(jsonTable[str]);

    }
}
profile
삶을 스스로 통제하고 있다는 느낌을 받을 때 더 행복하고 성공한다.🍃

0개의 댓글