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

use*_*567 124 c# json.net

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

Hab*_*bib 182

通过代码:

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

(使用JSON.Net)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

之所以要增加检查{[等是基于这样的事实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());
}
Run Code Online (Sandbox Code Playgroud)

(但是,您必须System.Json使用命令:PM> Install-Package System.Json -Version 4.0.20126.16343在包管理器控制台上通过Nuget包管理器安装)(取自此处)

非代码方式:

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

  • 如何在运行时执行此操作.我不想使用try catch进行验证 (2认同)
  • 有没有办法不用 try 块来做到这一点?除非我正在处理未知的问题,否则我不会使用 try 块。我正在寻找类似 JsonConvert.TryDeserializeObject 的东西。操作 try catch 只是简单的错误代码。 (2认同)
  • **使用 JSON.Net:** **不会**抛出异常:`JToken.Parse("1234")`!首先检查字符串是否以 `[` 或 `{` 开头可能是个好主意。另一种选择是使用`JObject.Parse()` 和`JArray.Parse()`。 (2认同)
  • `JToken.Parse("{a:1}")` **不会**抛出异常,即使这是无效的 JSON - 应该引用 `a` (http://stackoverflow.com/q/949449/3116322) (2认同)

小智 30

使用JContainer.Parse(str)方法检查str是否是有效的Json.如果这会抛出异常,那么它就不是有效的Json.

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

  • 使用类型JToken更有效,而不是JContainer,因为在此级别声明了Parse()方法 (17认同)
  • 我假设您正在谈论JSON.Net:JContainer不会**以这种方式工作,因为它不会在所有需要的情况下抛出异常.示例:`JContainer.Parse("1234");`. (6认同)
  • `1234` 是有效的 JSON。一些特定的源可能需要一个用花​​括号括起来的完整键值“字典”,但在一般情况下,基元也可以。 (2认同)

Tom*_*ech 15

基于Habib的答案,您可以编写一个扩展方法:

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

然后可以像这样使用:

if(stringObject.ValidateJSON())
{
    // Valid JSON!
}
Run Code Online (Sandbox Code Playgroud)

  • 不错的扩展方法:)虽然它可能最好命名为“IsValidJson”。 (3认同)
  • 为此无效的JSON返回`true`:`{A:{“ B”:1}}` (2认同)

Ωme*_*Man 10

\xe2\x9a\xa0\xef\xb8\x8f 使用System.Text.Json\xe2\x9a\xa0\xef\xb8\x8f 的替代选项

\n

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

\n
public static bool IsJsonValid(this string txt)\n{\n    try { return JsonDocument.Parse(txt) != null; } catch { return false; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • `JsonDocument` 是一次性的。如果不这样做将*[导致内存不返回到(内存)池,这将增加框架各个部分的 GC 影响。](https://learn.microsoft.com/en-us/dotnet /api/system.text.json.jsondocument?view=net-5.0)*,根据文档。所以你需要在某处添加一个“using”。 (2认同)
  • 抛出异常来验证业务规则就像检查 JSON 字符串一样常见,这是对应用程序整体性能的不可接受的忽视。从计算角度来说,异常是昂贵的。 (2认同)

Jal*_*lal 9

只是为@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;
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*rts 5

我发现JToken.Parse错误地解析了无效的JSON,如下所示:

{
"Id" : , 
"Status" : 2
}
Run Code Online (Sandbox Code Playgroud)

将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;
}
Run Code Online (Sandbox Code Playgroud)

  • Dominik,根据我对你链接的规范的读取的JSON值必须有一些有效的标记,文字空文本表示空值.根据您引用的规范,有效值为"对象,数组,数字,字符串,true,false或null".AFAICS没有有效值,没有值令牌. (3认同)