json string 을 가져오고 json data를 원하는 key value 값을 얻을 수 있는 형태로 파싱 하고자 함. (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
}
]
private string LoadJson()
{
var jsonPath = $"{Application.persistentDataPath}/{TESTJSON_FILENAME}";
if (File.Exists(jsonPath))
{
string JsonString = File.ReadAllText(jsonPath);
return JsonString;
}
else
{
return string.Empty;
}
}
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);
}
}
JArray는 JObject와 유사하지만 좀 더 좁은의미이고, Key 없이 Value를 불러올 수 있다.
JSON형태가 배열인 상황이므로 JArray 를 통해 변환해야 함을 개발팀 OO님께서 찾아주셨다..!
JObject로 변환하던 부분을 JArray로 변경 후 에러가 사라졌고 정상적으로 Key, Value를 반복문을 통해 가져올 수 있게 되었다.
JArray 형식으로 변환
JArray 형식을 일반 배열과 비슷하게 추출한다. Json 배열 추출 후 Dictionary<string, object>
형식으로 역직렬화 한다. ( Deserialize<Object>(string)
)
Dictionary 형태의 jsonTable
을 KeyValuePair
구조체를 활용하여 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);
}
}
}
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");
}
}
}
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");
}
}
}
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]);
}
}