EMDI는 지금도 개발중

C# : string to JSON using Newtonsoft.Json 본문

언어/C#

C# : string to JSON using Newtonsoft.Json

EMDI 2020. 3. 12. 15:55

현재 JSON형식으로 된 string을 파싱하여 데이터를 뽑아내려고 하고 있습니다. 길게 늘어져 있는 string을 어떻게 하면 파싱할 수 있을까? 바로 Newtonsoft.Json을 참조하여 사용하면 됩니다! 우선 Newtonsoft.Json을 사용하려면 해당 dll을 갖고 있어야하는데 dll은 아래를 다운받아 주세요.

 

Newtonsoft.Json.dll
0.67MB

 

내가 현재 작업하고 있는 프로젝트로 들어가서 해당 dll을 참조겁니다.

참조를 걸면 위와 같이 Newtonsoft.Json이 추가된 것을 확인할 수 있답니다.

그럼 이걸 어떻게 사용하는가? 우선 해당 dll을 참조만 건다고 해서 사용할 수 있는건 아닌거 아시죠?

 

저는 JObject와 JArray를 사용할 것이기 때문에 using Newtonsoft.Json.Linq를 using해줬습니다.

 

1. JObject를 가지고 JSON형식의 string 파싱해보기

{"TEST":{"ID":"user1","PASSWORD":"user123"}}

만약 위의 예시처럼 2개의 JSON형식의 string이 있다고 생각합시다. 그럼 이 string을 갖고 JObject를 하면 어떻게 될까요?

 

jobj["TEST"]["ID"]를 하면 해당 ID의 value인 user1을 아주 잘가져옵니다.

 

2. JObject를 가지고 여러 데이터 ROW가 들어가 있는 string 파싱해보기

{"TEST":{"ID":"user1","PASSWORD":"user123"}}

{"TEST":{"ID":"user2","PASSWORD":"user1234"}}

첫번째는 파싱이 잘되었으니 이번에는 row를 2개를 만들어서 한번 테스트를 해봅시다.

 

만약 다른 ID와 PASSWORD를 갖고 있더라도 같은 TEST의 object key를 갖고 있으면 additional text 오류가 납니다.

이런 경우 어떻게 해야하는 것일까?

 

3. JsonTextReader사용하기

{"TEST":[{"ID":"user1","PASSWORD":"user123"},{"ID":"user2","PASSWORD":"user1234"}]}

 

 
JsonTextReader reader = new JsonTextReader(new StringReader(fileInfo));
while (reader.Read())
{
    if (reader.Value != null)
    {
        if (reader.TokenType.Equals(JsonToken.PropertyName))
        {
            Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value);
        }
        
        if (reader.TokenType.Equals(JsonToken.String))
        {
            Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value);
        }
    }
}

JsonTextReader를 이용해서 데이터 추출하기. TEST, ID, PASSWORD같은 KEY는 JsonToken.PropertyName으로 나오고 user1, user123과 같은 value는 JsonToken.String으로 나오네요. 근데 이건 사용하기 조금 애매하는 부분인듯;

 

3. JArray 사용하기

{"TEST":[{"ID":"user1","PASSWORD":"user123"},{"ID":"user2","PASSWORD":"user1234"}]}

다시 원점으로 돌아와서 그럼 위의 데이터를 파싱하기 위해서는 도대체 어떤걸 사용해야하는가? 일단 찾다보니 JArray라는 것도 있어서 한번 테스트 해보기로 했습니다.

 

아까 전에 사용했던 JObject와 같이 데이터를 뽑을 수 있는걸 확인! 다만, 해당 JArray는 앞부분이 {"TEST":가 아닌 [array1, array2] 이런식으로 배열이 먼저 들어와야 합니다. 만약 {"TEST":가 먼저 들어오면,

 

위와같이 array를 읽는데에 오류가 나는것을 확인할 수 있습니다. 오류의 내용은 배열이 아니라는 의미

Comments