원시 문자열이 있습니다. 문자열이 유효한 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.Parse
및 JArray.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);
}
