C#에서 JSON 해석하기

.NET 5부터는 JSON을 해석하는 API가 기본적으로 제공되는 듯 하지만, 아직도 내 PC에는 .NET 5가 기본적으로 설치되어 있지 않으므로 다른 방안이 필요했고 Newtonsoft.Json이라는 매우 뛰어난 JSON 라이브러리가 있어 이를 사용하게 되었습니다.

설치는 간단이 Visual Studio의 Package Manager 기능을 통해 설치할 수 있으며 NuGet 사이트에서 제공하는 정보를 통해 쉽게 설치할 수 있습니다.

이제 다음과 같은 JSON을 해석해 봅시다. 이 JSON은 test.json이라는 파일이 저장되어 있습니다.

{
    "form0": {
        "metadata": {
            "title": "테스트"
        }
    },

    "form1": {
        "metadata": {
            "title": "연락처"
        }
    }
}

위에서 form0과 form1에 대한 정보를 얻어와야 하고, 각가게 대한 title 값을 얻어와야 합니다. 코드는 아래와 같습니다.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

...

var strFormJson = Utility.ReadAllTextFromFile("test.json");
var jsonForm = JObject.Parse(strFormJson);
var iter = jsonForm.GetEnumerator();

while(iter.MoveNext())
{
    var keyValue = iter.Current;
    MessageBox.Show(keyValue.Key + " " + keyValue.Value["metadata"]["title"].ToString());
}

JSON에 대해 배열에 대한 처리는 JArray로 타입을 변환하면 됩니다. 코드의 예는 다음과 같습니다.

var jsonLayers = JObject.Parse(strLayersJson);
var arrayJsonLayers = jsonLayers["layers"] as JArray;
var iterLayers = arrayJsonLayers.GetEnumerator();

while(iterLayers.MoveNext())
{
    var value = iterLayers.Current;
    var layerName = value["name"].ToString();

    ...
}

시간이 좀더 흘려 .NET 5가 사용자의 PC에 기본적으로 설치되는 날이 오면 .NET 5에서 제공하는 JSON API를 사용하시기 바랍니다.

C#에서 Spatialite 사용하기

Spatialite는 SQLite를 기반으로 하므로 먼저 SQLite를 설치해야 합니다. SQLite 사이트에서 Precompiled Binaries for 32-bit Windows (.NET Framework 4.6) 중 두번째인 sqlite-netFx46-binary-Win32-2015-1.0.113.0.zip 다운로드 받습니다. (Visual Studio에서 .NET WinForm 프로젝트에서 사용할 것인데 .NET 버전은 4.6으로 하고 32Bits로 설정함). 압축을 풀고 System.Data.SQLite.dll 파일 프로젝트 참조에 추가하고, SQLite.Interop.dll 파일은 프로젝트의 실행 파일이 생성되는 Debug 및 Release에 복사하면 SQLite의 기본 기능은 사용할 수 있게 됩니다.

이제 Spatialite를 사용하기 위해서는 이 파일을 다운로드 받아 압축을 풀고 전체 파일을 프로젝트의 실행 파일이 생성되는 Debug 및 Release 폴더에 복사합니다. 최종적으로 아래처럼 파일이 구성될 것입니다. (복사되어진 파일은 선택 상태로 둠)

이제 다음 코드를 테스트하면 정상 작동됩니다.

conn = new SQLiteConnection("Data Source=d:/db.sqlite;Version=3;");
conn.Open();

conn.LoadExtension("mod_spatialite");

String sql = "select sig_cd, ST_AsText(geometry) from TL_SCCO_SIG";
//String sql = "select sig_cd, geometry from TL_SCCO_SIG";
SQLiteCommand cmd = new SQLiteCommand(sql, conn);
SQLiteDataReader rdr = cmd.ExecuteReader();
            
while (rdr.Read())
{
    MessageBox.Show(rdr["sig_cd"] + " " + rdr.GetString(1));
    break;
}

rdr.Close();
conn.Close();
conn.Dispose();

위의 코드 중 4번 코드가 Spatialite 모듈을 확장 기능으로 적재합니다.