如何使用JSON.NET确保字符串是有效的JSON

时间:2013-02-20 10:42:37

标签: c# json.net

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

11 个答案:

答案 0 :(得分:153)

通过代码:

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

(使用JSON.Net)

最简单的方法是使用JToken.Parse Parse字符串,并检查字符串是以{还是[开头,以}结尾或]分别为(从此answer添加)

private static bool IsValidJson(string strInput)
{
    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"或{{1}等值的事实作为有效的令牌。另一种选择可能是在解析时同时使用"'a string'"JObject.Parse,看看其中是否有人成功,但我认为检查JArray.Parse{}应该更容易。< / em> (感谢@RhinoDevel pointing它出来了)

没有JSON.Net

您可以使用.Net framework 4.5 System.Json namespace,例如:

[]

(但是,您必须使用命令: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()); } 在包管理器控制台上通过Nuget包管理器安装System.Json (取自here

非代码方式:

通常,当有一个小的json字符串并且你试图在json字符串中发现错误时,我个人更喜欢使用可用的在线工具。我通常做的是:

答案 1 :(得分:26)

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

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

答案 2 :(得分:11)

根据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!
}

答案 3 :(得分:7)

只是为@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;
    }
}

答案 4 :(得分:5)

我发现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;
        }

答案 5 :(得分:2)

关于Tom Beech的回答;我想出了以下内容:

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);
}

答案 6 :(得分:2)

使用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;
}

答案 7 :(得分: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;
        }
    }

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

答案 8 :(得分: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; }
    }

答案 9 :(得分: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
}

答案 10 :(得分: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;
     }
  }