jsonata.net.native: Jsonata의 순수 닷넷 구현체

JSON은 여러 프로그래밍 언어들이 요즈음 공통적으로 지원하는 새로운 데이터 교환 포맷이고, 이제는 XML을 대신에서 더 널리 쓰이고 있습니다.

JSON에서도 예전에 XML을 다룰 때 사용하던 쿼리 언어인 XPath와 비슷한 수단을 제공하는 JSONPath가 널리 사용되고 있었습니다. 그러나 XPath에 비해 JSONPath는 상대적으로 기능 열화가 많고, 데이터 프로젝션이나 가공 기능이 거의 없다시피하다는 단점이 많이 아쉬운 부분입니다.

예를 들어 다음과 같이 JSONata 문법을 사용할 수 있습니다. 기존에 JSONpath로는 다룰 수 없는 부분이었죠.

$sum(Account.Order.Product.(Price * Quantity))

이런 부분을 보완하는 새로운 쿼리 언어인 JSONata가 공개되었고, 주요 클라우드 업체들이 JSONPath 대신 JSONata로 전환 도입하는 모습을 보게 됩니다.

닷넷에서도 JSONata를 다른 상호 운용성 장치 없이 순수 닷넷으로 구현한 라이브러리가 마침 있어 소개합니다. jsonata.net.native라는 라이브러리이고, 기존에 널리 사용되던 JSON .NET과 System.Text.Json을 모두 지원합니다.

다음은 코드 예시입니다.

var sampleJson = """
{
  "users": [
    {
      "userId": 1,
      "firstName": "AAAAA",
      "lastName": "as23",
      "phoneNumber": "123456",
      "emailAddress": "AAAAA@test.com",
      "homepage": "https://amogg.tistory.com/1"
    },
    {
      "userId": 2,
      "firstName": "BBBB",
      "lastName": "h5jdd",
      "phoneNumber": "123456",
      "homepage": "https://amogg.tistory.com/2"
    },
    {
      "userId": 3,
      "firstName": "CCCCC",
      "lastName": "2dhbs",
      "phoneNumber": "33333333",
      "homepage": "https://amogg.tistory.com/3"
    },
    {
      "userId": 4,
      "firstName": "DDDDD",
      "lastName": "bacasd",
      "phoneNumber": "222222222",
      "homepage": "https://amogg.tistory.com/4"
    },
    {
      "userId": 5,
      "firstName": "EEEEE",
      "lastName": "asdfasdf",
      "phoneNumber": "111111111",
      "homepage": "https://amogg.tistory.com/5"
    }
  ]
}
""";

var doc = JsonataExtensions.FromSystemTextJson(JsonDocument.Parse(sampleJson));
var query = new JsonataQuery("$.users[userId = 3].homepage");
Console.WriteLine(query.Eval(doc).ToObject<string>());

var sampleObj = new
{
	users = new object[]
	{
		new {
			userId = 1,
			firstName = "AAAAA",
			lastName = "as23",
			phoneNumber = "123456",
			emailAddress = "AAAAA@test.com",
			homepage = "https://amogg.tistory.com/1"
		},
		new {
			userId = 2,
			firstName = "BBBB",
			lastName = "h5jdd",
			phoneNumber = "123456",
			homepage = "https://amogg.tistory.com/2"
		},
		new {
			userId = 3,
			firstName = "CCCCC",
			lastName = "2dhbs",
			phoneNumber = "33333333",
			homepage = "https://amogg.tistory.com/3"
		},
		new {
			userId = 4,
			firstName = "DDDDD",
			lastName = "bacasd",
			phoneNumber = "222222222",
			homepage = "https://amogg.tistory.com/4"
		},
		new {
			userId = 5,
			firstName = "EEEEE",
			lastName = "asdfasdf",
			phoneNumber = "111111111",
			homepage = "https://amogg.tistory.com/5"
		},
	},
};

var obj = JsonataExtensions.FromObjectViaSystemTextJson(sampleObj);
var objQuery = new JsonataQuery("$.users[userId = 1].emailAddress");
Console.WriteLine(objQuery.Eval(obj).ToObject<string>());

이 예제에서 흥미로운 것은 단순히 JSON 문서를 다루는 것 뿐만 아니라 임의의 .NET 객체도 JSONata 방식으로 쿼리할 수 있도록 객체 그래프를 JSON 문서 형식으로 직렬화해주는 간단한 도우미 메서드도 있다는 점입니다. JSON이 원본이 아닌 다른 직렬화 포맷터가 원본인 .NET 객체를 대입하더라도 JSONata 쿼리를 쉽게 쓸 수 있게 만든건 유용할 것 같습니다!

그리고 JSONata 자체를 연습해보기 원하시면 아래 온라인 플레이그라운드도 확인해보시면 좋겠습니다.

https://try.jsonata.org

8 Likes