[C#] JSON.NET을 사용하여 문자열이 유효한 JSON인지 확인하는 방법

원시 문자열이 있습니다. 문자열이 유효한 JSON인지 여부를 확인하고 싶습니다. JSON.NET을 사용하고 있습니다.



답변

코드를 통해 :

가장 좋은 방법은 구문 분석 try-catch에 실패한 경우 내부에서 구문 분석을 사용 하고 예외를 포착 하는 것 입니다. (나는 TryParse방법을 모른다) .

(JSON.Net 사용)

가장 간단한 방법은하는 것입니다 Parse사용하여 문자열 JToken.Parse및 문자열로 시작하는 경우도 확인 {또는 [과 끝을 함께 }또는 ]각각 (이에서 추가 답변 ) :

private static bool IsValidJson(string strInput)
{
    if (string.IsNullOrWhiteSpace(stringValue)) { return false;}
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            var obj = JToken.Parse(strInput);
            return true;
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            Console.WriteLine(jex.Message);
            return false;
        }
        catch (Exception ex) //some other exception
        {
            Console.WriteLine(ex.ToString());
            return false;
        }
    }
    else
    {
        return false;
    }
}

그 이유는 대한 검사를 추가 {하거나 [등 사실에 기초하고 JToken.Parse같은 값을 구문 분석 "1234"또는 "'a string'"유효한 토큰으로. 다른 옵션은 모두 사용할 수 JObject.ParseJArray.Parse구문 분석에와 그들 중 누군가가 성공하면 볼 수 있지만, 나는 검사 믿고 {}하고 []쉽게해야합니다. (덕분에 대해 @RhinoDevel 가리키는 그것을 밖으로)

JSON.Net없이

다음 과 같이 .Net framework 4.5 System.Json 네임 스페이스를 활용할 수 있습니다 .

string jsonString = "someString";
try
{
    var tmpObj = JsonValue.Parse(jsonString);
}
catch (FormatException fex)
{
    //Invalid json format
    Console.WriteLine(fex);
}
catch (Exception ex) //some other exception
{
    Console.WriteLine(ex.ToString());
}

(하지만 패키지 관리자 콘솔에서 System.Json다음 명령을 사용하여 Nuget 패키지 관리자를 통해 설치해야 함 PM> Install-Package System.Json -Version 4.0.20126.16343) ( 여기 에서 가져옴 )

비 코드 방식 :

일반적으로 작은 json 문자열이 있고 json 문자열에서 실수를 찾으려고 할 때 개인적 으로 사용 가능한 온라인 도구를 선호합니다. 내가 보통하는 일은 :

  • JSONLint에 JSON 문자열 붙여 넣기 JSON Validator 는 유효한 JSON인지 확인합니다.
  • 나중에 올바른 JSON을 http://json2csharp.com/에 복사하고 이에 대한 템플릿 클래스를 생성 한 다음 JSON.Net을 사용하여 직렬화 해제하십시오.

답변

JContainer.Parse(str)str이 유효한 Json인지 확인하는 방법을 사용하십시오 . 이것이 예외를 던지면 유효한 Json이 아닙니다.

JObject.Parse-문자열이 유효한 Json 객체
JArray.Parse인지 확인하는 데 사용할 수 있습니다.-문자열이 유효한 Json 어레이
JContainer.Parse인지 확인하는 데 사용할 수 있습니다.-Json 객체와 배열을 모두 확인하는 데 사용할 수 있습니다


답변

Habib의 답변을 바탕으로 확장 방법을 작성할 수 있습니다.

public static bool ValidateJSON(this string s)
{
    try
    {
        JToken.Parse(s);
        return true;
    }
    catch (JsonReaderException ex)
    {
        Trace.WriteLine(ex);
        return false;
    }
}

다음과 같이 사용할 수 있습니다 :

if(stringObject.ValidateJSON())
{
    // Valid JSON!
}


답변

@Habib의 답변에 무언가를 추가하기 위해 주어진 JSON이 유효한 유형인지 여부를 확인할 수도 있습니다.

public static bool IsValidJson<T>(this string strInput)
{
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            var obj = JsonConvert.DeserializeObject<T>(strInput);
            return true;
        }
        catch // not valid
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}


답변

JToken.Parse가 다음과 같은 잘못된 JSON을 잘못 구문 분석한다는 것을 알았습니다.

{
"Id" : ,
"Status" : 2
}

JSON 문자열을 http://jsonlint.com/에 붙여 넣습니다 . 유효하지 않습니다.

그래서 나는 사용합니다 :

public static bool IsValidJson(this string input)
{
    input = input.Trim();
    if ((input.StartsWith("{") && input.EndsWith("}")) || //For object
        (input.StartsWith("[") && input.EndsWith("]"))) //For array
    {
        try
        {
            //parse the input into a JObject
            var jObject = JObject.Parse(input);

            foreach(var jo in jObject)
            {
                string name = jo.Key;
                JToken value = jo.Value;

                //if the element has a missing value, it will be Undefined - this is invalid
                if (value.Type == JTokenType.Undefined)
                {
                    return false;
                }
            }
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            Console.WriteLine(jex.Message);
            return false;
        }
        catch (Exception ex) //some other exception
        {
            Console.WriteLine(ex.ToString());
            return false;
        }
    }
    else
    {
        return false;
    }

    return true;
}


답변

JSON.Net을 사용하지 않는 ⚠️ 대체 옵션 ⚠️

.Net Core / .Net 5의 경우 ( 이 글을 쓰는 시점에서 미리보기에서 ) System.Text.Json네임 스페이스를 사용하고를 사용하여 구문 분석 할 수도 있습니다 JsonDocument. 네임 스페이스 작업을 기반으로하는 확장 방법은 다음과 같습니다.

public static bool IsJsonValid(this string txt)
{
    try { return JsonDocument.Parse(txt) != null; } catch {}

    return false;
}


답변

톰 비치의 대답에 대하여; 대신 다음을 생각해 냈습니다.

public bool ValidateJSON(string s)
{
    try
    {
        JToken.Parse(s);
        return true;
    }
    catch (JsonReaderException ex)
    {
        Trace.WriteLine(ex);
        return false;
    }
}

다음을 사용하여 :

if (ValidateJSON(strMsg))
{
    var newGroup = DeserializeGroup(strMsg);
}