我知道我可以使用一个外部库(newtonsoft)和try/catch来检查一个字符串是否是有效的json结构。我不想反序列化到一个对象(因为json可以是一个或多个属性),重点是确保它是有效的json。我更喜欢使用System.Text.Json,但不确定TryParseValue,JsonDocument等哪个最好
yxyvkwin1#
如果你的JSON格式是string,并且你使用的是System.Text.Json,那么检查JSON格式是否正确的最好方法可能是使用JsonDocument.Parse。例如:
string
System.Text.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; } } }
n3ipq98p2#
我使用Utf8 JsonReader并简单地在根对象上调用TrySkip();这将检查它是否至少形成良好。
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; }
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; } }
4条答案
按热度按时间yxyvkwin1#
如果你的JSON格式是
string
,并且你使用的是System.Text.Json
,那么检查JSON格式是否正确的最好方法可能是使用JsonDocument.Parse
。例如:n3ipq98p2#
我使用Utf8 JsonReader并简单地在根对象上调用TrySkip();这将检查它是否至少形成良好。
qhhrdooz3#
这个例子在我使用.NET Core 3.1时很有效,如果字符串不是格式良好的JSON,它会抛出一个异常:
qf9go6mv4#
@bytedev答案的一个小改进,基于Microsoft JsonDocument处理JsonDocument备注:
这个类利用池内存中的资源来最小化垃圾回收器(GC)在高使用率场景中的影响。如果不能正确释放这个对象,将导致内存不返回到池中,这将增加GC对框架各个部分的影响