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

时间:2019-06-27 23:03:41

标签: c# system.json

我想使用System.Json.JsonArray.Contains()来查看我的Array是否包含特定值。下面是一个最小的示例。我希望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,如何检查数组是否包含数值,以及为什么上面的示例返回false?

2 个答案:

答案 0 :(得分:2)

我以前从未使用过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();

答案 1 :(得分:1)

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

一般来说,该API似乎有点笨拙,没有经过深思熟虑,Stephen Toub实际上从1月份起将其称为this commit message中的“旧版System.Json库”,因此我猜想该库已被Microsoft弃用。支持JSON.NET,我同意Seth的话,最好使用它。

如果您仍然想坚持使用它,那么使用Select()Seth's solution可能是可行的方法。