ChakraCore를 JSON 디코더 및 인코더로 활용하기

다른 프로그래밍 언어(JS, Python, Ruby, PHP, Perl 등)를 경험해온 사람들이 닷넷의 JSON 처리 방식에 의문을 가지면서, 닷넷 기반의 프로젝트에서 JSON 처리를 백지에서부터 고민해봐야 하는 상황이 있었습니다.

이때 ChakraCore라는 Microsoft에서 배포한 오픈소스 JavaScript 엔진을 활용하여 이러한 의문에 대한 답을 제시하게 되었습니다. 이때의 고민을 정리한 내용을 공유해봅니다.

ChakraCore를 JSON 디코더 및 인코더로 활용하기

감사합니다.

5개의 좋아요

깊이있는 아티클 공유 감사드립니다.

ChakraCore가 커뮤니티 주도로 계속해서 업데이트가 이루어지고 있는지 몰랐습니다. :open_mouth:

1개의 좋아요

코드 공유 감사드립니다.

혹시 아래 내용에 대해 구체적인 케이스를 알 수 있을까요?

1개의 좋아요

자료의 양이 많은 케이스보단, 응답받은 JSON 데이터의 필드의 유형이 다양하고 유동적인 경우에 더 깔끔하게 대응하는 방법을 찾아야했습니다.

엄격하게 다루려면 많은 클래스 생성과 복잡한 역직렬화 과정이 기다리고 있으니까요. JSON 라이브러리 자체만으로도 이미 크기가 크기도하고요.

반면에, 언급한 다른 프로그래밍 언어들은 상대적으로 이런 걱정이 덜하거나 거의 없습니다.

이전에도 논의는 있었지만 실제 적용이 결정된건 IP 주소를 기반으로 한 기술적 조회(서버 검색 등) 서비스에서 나오는 응답이 이러한 특징을 가지고 있기 때문이었습니다.

이후에는 JSON을 다루는 경험은 확실히 JavaScript 스타일로 다루는게 좋기 때문에 이걸 최대한 살려서 처리를 단순화하는 쪽으로 활용 사례를 넓혔습니다.

1개의 좋아요

글쎄요 런타임의 자원이나 최신닷넷에 대한 의존성에 극단적인 제약이 있다면 필요할까 싶지만 예시코드의 스타일만 봤을때는 Newtonsoft.Json.Linq 혹은 System.Text.Json.Nodes 를 사용하는것과의 차이를 잘 모르겠습니다.
강타입의 수혜를 최대한으로 누리고자 Serialization을 권장하는거지 방법이 한정되있지는 않아용

  • json생성
using System.Text.Json.Nodes;
var color = System.Drawing.Color.White;
var doc = new JsonObject
{
    ["ok"] = true,
    ["hex"] = "#FFFFFF",
    ["name"] = null,
    ["rgb"] = new JsonObject
    {
        ["r"] = color.R,
        ["g"] = color.G,
        ["b"] = color.B
    }
};
Console.WriteLine(doc);
{
  "ok": true,
  "hex": "#FFFFFF",
  "name": null,
  "rgb": {
    "r": 255,
    "g": 255,
    "b": 255
  }
}
  • json파싱
using System.Text.Json.Nodes;
bool TryParse(string body, out string? imageJson, out (int x, int y)? point)
{
    try
    {
        var id = JsonNode.Parse(body);
        imageJson = (string)id["image"];
        var p = id["point"];
        point = ((int)p["x"], (int)p["y"]);
        return true;
    }
    catch
    {
        imageJson = null;
        point = null;
        return false;
    }
}
Console.WriteLine(new {
    good = TryParse("""{"image":"😺","point":{"x":1,"y":2}}""", out var img, out var p),
    img, p
});
{ good = True, img = 😺, p = (1, 2) }
3개의 좋아요

말씀 감사합니다!

보여주신 예제도 많이 간단하고 보통은 무리가 없을 것으로 보입니다.

하지만 제 경우는 예시로 보여주신 그정도 수준의 스타일마저도 사용이 거부되던 상황이었던터라.. 다른 방법이 필요했기에 만든 방법이기도 합니다. ㅠㅠ

3개의 좋아요