181

我有一个原始字符串。我只想验证字符串是否是有效的 JSON。我正在使用 JSON.NET。

4

12 回答 12

267

通过代码:

最好的办法是在 a 中使用 parsetry-catch并在解析失败的情况下捕获异常。(我不知道任何TryParse方法)

(使用 JSON.Net)

最简单的方法是Parse使用JToken.Parse, 并检查字符串是否分别以or开头和以{or[结尾(从这个答案添加)}]

private static bool IsValidJson(string strInput)
{
    if (string.IsNullOrWhiteSpace(strInput)) { 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;
    }
}

{添加or等​​检查的原因[是基于JToken.Parse将解析值(例如"1234"or"'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 字符串中查找错误时,我个人更喜欢使用可用的在线工具。我通常做的是:

于 2013-02-20T10:46:08.840 回答
37

使用JContainer.Parse(str)方法检查 str 是否是有效的 Json。如果这引发异常,则它不是有效的 Json。

JObject.Parse- 可用于检查字符串是否为有效的 Json 对象
JArray.Parse- 可用于检查字符串是否为有效的 Json 数组
JContainer.Parse- 可用于检查 Json 对象和数组

于 2013-11-26T13:30:05.957 回答
29

基于 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!
}
于 2015-07-14T10:38:50.323 回答
14

只是为了在@Habib 的答案中添加一些内容,您还可以检查给定的 JSON 是否来自有效类型:

public static bool IsValidJson<T>(this string strInput)
{
    if(string.IsNullOrWhiteSpace(strInput)) return false;

    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;
    }
}
于 2016-04-23T06:54:40.463 回答
10

我发现 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;
}
于 2016-04-26T06:38:41.000 回答
3

System.Text.Json⚠️使用⚠️的替代选项

对于 .Net Core,还可以使用System.Text.Json命名空间并使用JsonDocument. 示例是基于命名空间操作的扩展方法:

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

    return false;
}
于 2020-06-15T17:36:35.557 回答
2

关于汤姆比奇的回答;我想出了以下内容:

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);
}
于 2016-01-06T15:07:47.573 回答
1

JToken.Type解析成功后可用。这可用于消除上述答案中的一些前导,并为更好地控制结果提供洞察力。完全无效的输入(例如,"{----}".IsValidJson();仍然会抛出异常)。

    public static bool IsValidJson(this string src)
    {
        try
        {
            var asToken = JToken.Parse(src);
            return asToken.Type == JTokenType.Object || asToken.Type == JTokenType.Array;
        }
        catch (Exception)  // Typically a JsonReaderException exception if you want to specify.
        {
            return false;
        }
    }

Json.Net 参考JToken.Typehttps ://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm

于 2020-02-06T17:04:15.480 回答
0

此方法不需要外部库

using System.Web.Script.Serialization;
bool IsValidJson(string json)
    {
        try {
            var serializer = new JavaScriptSerializer();
            dynamic result = serializer.DeserializeObject(json);
            return true;
        } catch { return false; }
    }
于 2017-09-07T17:42:33.003 回答
0

这是基于 Habib 回答的 TryParse 扩展方法:

public static bool TryParse(this string strInput, out JToken output)
{
    if (String.IsNullOrWhiteSpace(strInput))
    {
        output = null;
        return false;
    }
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            output = JToken.Parse(strInput);
            return true;
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            //optional: LogError(jex);
            output = null;
            return false;
        }
        catch (Exception ex) //some other exception
        {
            //optional: LogError(ex);
            output = null;
            return false;
        }
    }
    else
    {
        output = null;
        return false;
    }
}

用法:

JToken jToken;
if (strJson.TryParse(out jToken))
{
    // work with jToken
}
else
{
    // not valid json
}
于 2020-03-31T19:45:41.420 回答
0

我正在使用这个:

  internal static bool IsValidJson(string data)
  {
     data = data.Trim();
     try
     {
        if (data.StartsWith("{") && data.EndsWith("}"))
        {
           JToken.Parse(data);
        }
        else if (data.StartsWith("[") && data.EndsWith("]"))
        {
           JArray.Parse(data);
        }
        else
        {
           return false;
        }
        return true;
     }
     catch
     {
        return false;
     }
  }
于 2020-04-19T20:30:45.683 回答
-1

即使返回异常也返回 json 字符串的扩展:

        公共静态字符串 OnlyValidJson(此字符串 strInput)
        {
            if (string.IsNullOrWhiteSpace(strInput)) { return @"[""Json 为空""]"; }
            strInput = strInput.Trim();
            if ((strInput.StartsWith("{") && strInput.EndsWith("}")) ||
                (strInput.StartsWith("[") && strInput.EndsWith("]")))
            {
                尝试
                {
                    字符串 strEscape = strInput.Replace("\\n", "").Replace("\\r", "").Replace("\n", "").Replace("\r", "") ;
                    JToken.Parse(strEscape);
                    返回strEscape;
                }
                捕捉(JsonReaderException jex)
                {
                    返回@$"{{""JsonReaderException"":""{jex.Message}""}}";
                }
                捕捉(例外前)
                {
                    Console.WriteLine(ex.ToString());
                    返回@$"{{""异常"":""{ex.ToString()}""}}";
                }
            }
            别的
            {
                return @"[""Json 不以 { 或 [.""]" 开头;
            }
        }

于 2021-11-12T19:02:17.567 回答