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


当前回答

JToken。类型在解析成功后可用。这可以用来消除上面答案中的一些序言,并为更好地控制结果提供见解。完全无效的输入(例如,“{----}”. 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。类型:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm

其他回答

JToken。类型在解析成功后可用。这可以用来消除上面答案中的一些序言,并为更好地控制结果提供见解。完全无效的输入(例如,“{----}”. 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。类型:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm

我用的是这个:

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

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

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

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

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