在.NET Core 3.0中验证字符串是否为有效json(最快的方法)

alen0pnh  于 2023-04-08  发布在  .NET
关注(0)|答案(4)|浏览(377)

我知道我可以使用一个外部库(newtonsoft)和try/catch来检查一个字符串是否是有效的json结构。我不想反序列化到一个对象(因为json可以是一个或多个属性),重点是确保它是有效的json。
我更喜欢使用System.Text.Json,但不确定TryParseValue,JsonDocument等哪个最好

yxyvkwin

yxyvkwin1#

如果你的JSON格式是string,并且你使用的是System.Text.Json,那么检查JSON格式是否正确的最好方法可能是使用JsonDocument.Parse。例如:

public static class StringExtensions
{
    public static bool IsJson(this string source)
    {
        if (source == null)
            return false;

        try
        {
            JsonDocument.Parse(source);
            return true;
        }
        catch (JsonException)
        {
            return false;
        }
    }
}
n3ipq98p

n3ipq98p2#

我使用Utf8 JsonReader并简单地在根对象上调用TrySkip();这将检查它是否至少形成良好。

qhhrdooz

qhhrdooz3#

这个例子在我使用.NET Core 3.1时很有效,如果字符串不是格式良好的JSON,它会抛出一个异常:

string json = "{ \"TestKey\": \"TestValue\" }";

// Ensure the string is valid JSON.
try
{
    var js = new Newtonsoft.Json.JsonSerializer();
    js.Deserialize(new Newtonsoft.Json.JsonTextReader(new System.IO.StringReader(json)));
}
catch (Newtonsoft.Json.JsonReaderException)
{
    throw;
}
qf9go6mv

qf9go6mv4#

@bytedev答案的一个小改进,基于Microsoft JsonDocument处理JsonDocument备注:
这个类利用池内存中的资源来最小化垃圾回收器(GC)在高使用率场景中的影响。如果不能正确释放这个对象,将导致内存不返回到池中,这将增加GC对框架各个部分的影响

public static bool IsJsonValid(this string json)
{
    if (string.IsNullOrWhiteSpace(json))
        return false;

    try
    {
        using var jsonDoc = JsonDocument.Parse(json);
        return true;
    }
    catch (JsonException)
    {
        return false;
    }
}

相关问题