Как правильно использовать 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();