Как правильно использовать System.Json.JsonArray.Contains()

Я хочу использовать System.Json.JsonArray.Contains(), чтобы увидеть, содержит ли мой массив определенное значение. Ниже приведен минимальный пример. Я ожидаю, что оба бара Varibales и 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 ответа

Решение

JsonArray.Contains() выполняет здесь внутреннюю функцию List.Contains, поэтому в этом случае он фактически выполнит сравнение ссылок, то есть вам нужно будет передать ему фактический экземпляр JsonPrimitive уже в массиве, который вы искали. То же самое касается всех других методов JsonArray, которые принимают JsonValue. Не очень полезно для вашего случая использования.

API в целом выглядит немного неуклюжим и не очень хорошо продуманным, и Стивен Туб фактически упоминает его как "устаревшую библиотеку System.Json" в этом сообщении коммита от января, так что я думаю, что эта библиотека устарела Microsoft в пользу JSON.NET, и я бы согласился с Сетом, что вам лучше использовать это вместо.

Если вы все еще хотите придерживаться этого, решение Сета с использованием Select(), вероятно, является подходящим вариантом.

Я никогда раньше не использовал 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();
Другие вопросы по тегам