如何正确使用 System.Json.JsonArray.Contains()

How to properly use System.Json.JsonArray.Contains()

我想使用 System.Json.JsonArray.Contains() 来查看我的数组是否包含特定值。下面是一个最小的例子。我希望 varibales bar 和 baz 都是 true,但它们都是 false。 使用了 nuget 包 System.Json v4.5。

    using System;
    using System.Json;

    public class Program
    {
        public static void Main()
        {
            bool bar = ((JsonArray)JsonValue.Parse("{\"foo\": [1,2,3]}")["foo"]).Contains(2);
            bool baz = ((JsonArray)JsonValue.Parse("{\"foo\": [1,2,3]}")["foo"]).Contains(new JsonPrimitive(2));
            Console.WriteLine($"contains 2?: {bar} {baz}");
            Console.ReadKey();
        }
    }

使用 System.Json,我如何检查数组是否包含数值以及为什么上面的示例 return 为假?

我以前从未使用过 System.Json,但它似乎可能是类型错误(将 int 与 JsonValue 进行比较)。 您可以在检查之前将值转换为 int,这应该可以工作。 这是一个使用 linq 的例子。

bool bar = ((JsonArray)JsonValue.Parse("{\"foo\": [1,2,3]}")["foo"]).Select(a=>(int)a).Contains(2);
Console.WriteLine($"contains 2?: {bar}");
Console.ReadKey();

JsonArray.Contains() 在内部执行 List.Contains here 因此在这种情况下,它实际上将执行引用比较,这意味着您需要将其传递给它的实际实例JsonPrimitive 已经在您要查找的数组中。 JsonArray 的所有其他采用 JsonValue 的方法也是如此。对您的用例不是很有用。

总的来说,API 看起来有点笨拙而且没有经过深思熟虑,Stephen Toub 实际上从 1 月份开始就将其称为 this commit message 中的 "legacy System.Json library",所以我猜这个库已被 Microsoft 弃用,取而代之的是 JSON.NET,我同意 Seth 的观点,你最好还是使用它。

如果您仍想坚持使用, 使用 Select() 可能是可行的方法。