如何检查Json对象是否已填充所有值



我从一个外部api得到一个大的嵌套json对象。我想确保所有字段都填充在json对象中。有图书馆可以做这件事吗?Newtonsoft.JsonJToken类,它检查Json的模式是否有效,但我找不到任何方法来检查Json对象内的所有字段是否都已填充。

场景:我正在构建一个api,用于收集有关个人或实体的信息。有许多信息来源。我需要继续搜索数据,直到所需的对象已满为止。所以第一个调用转到api1,获取一些数据,检查对象是否已满。如果对象未满,则转到api2,依此类推。因此,该调用在对象满后返回一个关键点是所需的对象模式不是静态的

我可以将它反序列化为POCO,并在每个嵌套对象中循环,但我正在寻找更好的解决方案。

任何建议都将不胜感激。

如果我理解正确,您有一些复杂的JSON对象,其中包含一组必需和非必需的属性。

我在这里看到三个解决方案:

  1. 您已经提到了JSON模式验证。以下是其中一个实现:Json.NET Schema
  2. 创建一个POCO对象,并用相应的Required/Not Required属性标记所有属性。在这种情况下,如果json字符串不包含任何强制数据,则会出现异常。例如,Json是如何做到这一点的。NET的JsonPropertyAttribute:

    [JsonObject]
    public class PocoObject
    {
    [JsonProperty("$schema", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
    public string Schema { get; set; }
    [JsonProperty("name", Required = Required.Always)]
    public string Name { get; set; }
    [JsonProperty("properties", Required = Required.Always)]
    public MorePropertiesObject Properties { get; set; }
    }
    

    作为奖励,您可以添加自定义属性、方法、转换器等

  3. 将原始json反序列化为类似Dictionary的结构,并使用自己亲手编写的验证器进行验证。类似于:

    try
    {
    var jo = JObject.Parse(jsonString);
    Contract.Assert(!string.IsNullOrEmpty(jo["root"]["prop1"].ToString()));
    Contract.Assert(!string.IsNullOrEmpty(jo["root"]["prop2"].ToString()));
    }
    catch (JsonReaderException) { }
    catch (JsonSerializationException) { }
    

所提供的代码示例用于您提到的Newtonsoft.Json

如果您有一个JSON字符串,并且只想检查任何属性值或数组项是否为null,那么您可以解析为JToken,使用JContainer.DescendantsAndSelf()递归下降JToken层次结构,并使用以下扩展方法检查每个JValue是否为null

public static partial class JsonExtensions
{
public static bool AnyNull(this JToken rootNode)
{
if (rootNode == null)
return true;
// You might consider using some of the other checks from JsonExtensions.IsNullOrEmpty()
// from https://stackoverflow.com/questions/24066400/checking-for-empty-null-jtoken-in-a-jobject
return rootNode.DescendantsAndSelf()
.OfType<JValue>()
.Any(n => n.Type == JTokenType.Null);
}
public static IEnumerable<JToken> DescendantsAndSelf(this JToken rootNode)
{
if (rootNode == null)
return Enumerable.Empty<JToken>();
var container = rootNode as JContainer;
if (container != null)
return container.DescendantsAndSelf();
else
return new[] { rootNode };
}
}

然后做:

var root = JToken.Parse(jsonString);
var anyNull = root.AnyNull();

如果您只想检查null属性值(即数组中的null值可以),您可以使用以下扩展方法:

public static partial class JsonExtensions
{
public static bool AnyNullPropertyValues(this JToken rootNode)
{
if (rootNode == null)
return true;
return rootNode.DescendantsAndSelf()
.OfType<JProperty>()
.Any(p => p.Value == null || p.Value.Type == JTokenType.Null);
}
}

(从你的问题中还不完全清楚你想要哪个。)

样品。网络小提琴。

相关内容

  • 没有找到相关文章

最新更新