2022년 2월 27일 일요일

C# Litjson Extension

저는 C# 개발을 할때 json 라이브러리는 Litjson을 주로 사용합니다.


편하게 사용하기 위해서 정적 클래스 하나 만드러서 사용하다가 이번에는 익스텐션을 만들어 보았습니다.


확실히 편하게 사용할 수 있는 부분은 찾아보는 것이 좋은것 같습니다.


사용하는 litjson 라이브러는 0.17.0 버전입니다. 이전이나 이후도 별 상관은 없을것 같네요.

dotnet6로 만든 소스구요 null에 대한부분 ? 없애는 정도면 되지 않을까 싶네요.


사용법은

JsonData jd;

jd.GetInt();

jd.GetString();

아래 소스를 보시면 아시겠지만 어떻게든 값을 얻어옵니다.

타입 체크가 필요하면 하고 하면 될것이구요.

IsNumber의 경우 숫자 형태가 너무 많아서 추가했습니다.

필요한 것이 있으면 더 추가하면 될것이구요.

하여간 도움이 되면 좋겠습니다~


파일을 올릴수가 없네요.

소스입니다.

namespace LitJson
{
    internal static class LitjsonExtension
    {
        public static bool IsNumber(this JsonData jd)
        {
            switch (jd.GetJsonType())
            {
                case JsonType.Int:
                case JsonType.Long:
                case JsonType.Double: return true;
                default: return false;
            }
        }
        public static bool GetBool(this JsonData jd)
        {
            if (jd == null) return false;
            switch (jd.GetJsonType())
            {
                case JsonType.String: return Convert.ToBoolean((string)jd);
                case JsonType.Int: return Convert.ToBoolean((int)jd);
                case JsonType.Long: return Convert.ToBoolean((long)jd);
                case JsonType.Double: return Convert.ToBoolean((double)jd);
                case JsonType.Boolean: return (bool)jd;
                case JsonType.None:
                case JsonType.Object:
                case JsonType.Array:
                default: return false;
            }
        }
        public static int GetInt(this JsonData jd)
        {
            if (jd == null) return 0;
            switch (jd.GetJsonType())
            {
                case JsonType.String: return Convert.ToInt32((string)jd);
                case JsonType.Int: return (int)jd;
                case JsonType.Long: return Convert.ToInt32((long)jd);
                case JsonType.Double: return Convert.ToInt32((double)jd);
                case JsonType.Boolean: return Convert.ToInt32((bool)jd);
                case JsonType.None:
                case JsonType.Object:
                case JsonType.Array:
                default: return 0;
            }
        }
        public static long GetLong(this JsonData jd)
        {
            if (jd == null) return 0;
            switch (jd.GetJsonType())
            {
                case JsonType.String: return Convert.ToInt64((string)jd);
                case JsonType.Int: return Convert.ToInt64((int)jd);
                case JsonType.Long: return (long)jd;
                case JsonType.Double: return Convert.ToInt64((double)jd);
                case JsonType.Boolean: return Convert.ToInt64((bool)jd);
                case JsonType.None:
                case JsonType.Object:
                case JsonType.Array:
                default: return 0;
            }
        }
        public static double GetDouble(this JsonData jd)
        {
            if (jd == null) return 0;
            switch (jd.GetJsonType())
            {
                case JsonType.String: return Convert.ToDouble((string)jd);
                case JsonType.Int: return Convert.ToDouble((int)jd);
                case JsonType.Long: return Convert.ToDouble((long)jd);
                case JsonType.Double: return (double)jd;
                case JsonType.Boolean: return Convert.ToDouble((bool)jd);
                case JsonType.None:
                case JsonType.Object:
                case JsonType.Array:
                default: return 0;
            }
        }
        public static string? GetString(this JsonData jd)
        {
            if (jd == null) return null;
            switch (jd.GetJsonType())
            {
                case JsonType.Object:
                case JsonType.Array: return jd.ToJson();
                case JsonType.String: return (string)jd;
                case JsonType.Int: return Convert.ToString((int)jd);
                case JsonType.Long: return Convert.ToString((long)jd);
                case JsonType.Double: return Convert.ToString((double)jd);
                case JsonType.Boolean: return Convert.ToString((bool)jd);
                case JsonType.None:
                default: return null;
            }
        }
    }
}

C# Async/Await Task 속도가 느릴 때 (TaskCompletionSource)

고전적인 개발 방법으로는 작업이 끝났는지 확인하기 위해서 작업 내용을 확인하는 루프를 만들어서 확인을 하는데 나는 이걸 mysql 풀링에 사용했었다. 그러니까 지금 사용 가능한 mysql 연결이 있는지를 task 에서 루프 돌면서 확인하는 방식으로 만...