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


当前回答

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

其他回答

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

关于汤姆·比奇的回答;相反,我想到了以下几点:

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

通过代码:

最好的办法是在try-catch和catch异常中使用parse,以防解析失败。(我不知道任何TryParse方法)。

(使用JSON.Net)

最简单的方法是使用JToken解析字符串。解析,并检查字符串是否以{或[开始,并分别以}或]结束(从这个答案中添加):

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

为{或[etc]添加检查的原因是基于JToken。Parse会将诸如“1234”或“'a string'”之类的值解析为有效的标记。另一种选择是同时使用两个JObject。解析和JArray。在解析中进行解析,看看是否有人成功,但我相信检查{}和[]应该更容易。(感谢@RhinoDevel指出这一点)

没有JSON。网

你可以利用。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());
}

(但是,你必须安装系统。PM>安装包系统。Json -版本4.0.20126.16343在包管理器控制台)(从这里)

非代码:

通常,当有一个小的json字符串,你试图在json字符串中找到一个错误,那么我个人更喜欢使用可用的在线工具。我通常做的是:

在JSONLint的JSON验证器中粘贴JSON字符串,看看是否 它是一个有效的JSON。 稍后将正确的JSON复制到http://json2csharp.com/和 为它生成一个模板类,然后反序列化它 使用JSON.Net。

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

我找到了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;
}