Получить специфицированный c элемент из массива System.Text. Json без перечисления - PullRequest
0 голосов
/ 04 мая 2020

С 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) выполнения
  • массив может быть довольно большим (не только два элемента)
...