С JsonValueKind.Object
вы можете использовать:
value.GetProperty("XXX")
С JsonValueKind.Array
вы можете использовать:
value.EnumerateArray().ElementAtOrDefault(2)
Но также возможно получить указанный индекс c без перечисления массива?
Причина в том, что это вызывается в узком l oop.
Я мог бы прочитать все значения и кэшировать их в словаре самостоятельно, но, когда я прочитал, что System.Text.Json
специально создан для производительности, я не хочу выделять ненужные словари.
Вот пример.
static void Main(string[] args)
{
var json = JsonSerializer.Deserialize<JsonElement>(@"[ ""item1"", ""item2""]");
// (seems) to enumerate the whole object - so slow in loops with large arrays
var test1 = json.EnumerateArray().ElementAtOrDefault(1);
// FIXME: crashes
var test2 = json.GetProperty("1");
// would love to have (return null when not existing - does not enumerate array - dictionary-like performance)
// var test3 = json.GetElementAt("1");
}
Обратите внимание, что
- фактический код вызывается в жестком l oop - ему нужно близко к O (1) выполнения
- массив может быть довольно большим (не только два элемента)