Прочитать динамическое свойство JSON

Итак, в настоящее время я использую JSON.NET в Visual Studio для анализа моего JSON, поскольку использование десериализации слишком медленно для того, что я пытаюсь сделать. Я получаю информацию об акциях от TD Ameritrade и могу запросить несколько акций одновременно. Приведенный ниже результат JSON получен только из 1. Как видите, первая строка - «TQQQ». Если бы я вытащил более одной акции, у меня было бы «TQQQ», а затем «CEI» в отдельных блоках, представляющих разные объекты.

При нормальной десериализации я мог бы просто сказать десериализовать словарь, и он поместил бы их в словарь соответственно с любым классом, который я написал для его заполнения. Однако, поскольку мне нужно анализировать строку за строкой, есть ли чистый способ определить, когда я добрался до следующего объекта?

Я мог бы сказать, чтобы отслеживать самое последнее поле, а затем добавить следующую строку (имя следующего тикера) в словарь, но это кажется немного взломанным.

Я не думаю, что нужен какой-либо код VB, кроме первоначального запуска создания нового JSONReader.

{
  "TQQQ": {
    "assetType": "ETF",
    "symbol": "TQQQ",
    "description": "ProShares UltraPro QQQ",
    "bidPrice": 54.59,
    "bidSize": 200,
    "bidId": "Q",
    "askPrice": 54.6,
    "askSize": 8000,
    "askId": "Q",
    "lastPrice": 54.6,
    "lastSize": 100,
    "lastId": "P",
    "openPrice": 51.09,
    "highPrice": 54.6,
    "lowPrice": 50.43,
    "bidTick": " ",
    "closePrice": 48.92,
    "netChange": 5.68,
    "totalVolume": 14996599,
    "quoteTimeInLong": 1540493136946,
    "tradeTimeInLong": 1540493136946,
    "mark": 54.6,
    "exchange": "q",
    "exchangeName": "NASDAQ",
    "marginable": true,
    "shortable": true,
    "volatility": 0.02960943,
    "digits": 4,
    "52WkHigh": 73.355,
    "52WkLow": 38.6568,
    "nAV": 0,
    "peRatio": 0,
    "divAmount": 0,
    "divYield": 0,
    "divDate": "2016-12-21 00:00:00.0",
    "securityStatus": "Normal",
    "regularMarketLastPrice": 54.6,
    "regularMarketLastSize": 1,
    "regularMarketNetChange": 5.68,
    "regularMarketTradeTimeInLong": 1540493136946,
    "delayed": true
  }
}

К сожалению, ни того, ни другого. Я прошел через оба. Проблема заключается в том, чтобы знать, когда различать, когда начинается новый объект. Atm Я просто читаю до последнего свойства, а затем добавляю следующую строку в словарь. Действительно хакерский.

Jacob Macallan 25.10.2018 21:26

В чем именно проблема? У меня 25 мсек до JObject.Parse (YourJson). Как быстро ты этого хочешь?

CruleD 26.10.2018 02:48

Тогда вам, вероятно, понадобится собственный парсер. Вероятно, вы можете разделить строку с помощью '{', '}' и проанализировать отдельные части.

Slai 26.10.2018 14:02

@CruleD, как я уже сказал, процесс отражения идет слишком медленно. В настоящее время я использую специальный синтаксический анализатор, рекомендованный Slai, и теперь он обрабатывает его почти в 3 раза быстрее. Использование JObject.Parse в два раза медленнее по сравнению с использованием JSonTextReader и построчным чтением.

Jacob Macallan 27.10.2018 02:48

Так это занимает 8 мс?

CruleD 27.10.2018 03:17
JSonTextReader по-прежнему имеет много накладных расходов по сравнению с полностью настраиваемым парсером. Если нужно, чтобы это было еще быстрее, другим вариантом может быть настройка .NET JavaScriptObjectDeserializer или другого кода синтаксического анализа.
Slai 27.10.2018 09:49

@CruleD Пользовательский синтаксический анализ занимает 5 мс. JSON.NET занимает 25 мс. JObject.Parse занимает 11 мс. Мне просто нужно максимально быстрое решение, поскольку оно имеет дело с данными в реальном времени и как быстро мы можем подготовить его и подготовить к работе. Единственная причина, по которой я даже спрашиваю о чем-то еще, помимо кастомного, заключается в том, что это не кажется очень удобным в обслуживании в отличие от сериализации, но похоже, что это просто компромисс.

Jacob Macallan 27.10.2018 10:41
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
8
111
1

Ответы 1

Is there a clean way of being able to tell when I've arrived at the next object?

Да, предполагая, что вы используете JsonTextReader, вы можете посмотреть свойство TokenType и проверить, является ли оно StartObject. Это соответствует открывающим скобкам { в JSON. Существует также тип токена EndObject, соответствующий закрывающим скобкам }, который, вероятно, также будет полезен в зависимости от того, как написан ваш код.

Типичный образец использования выглядит примерно так:

If reader.TokenType == TokenType.StartObject Then
    While reader.Read() AndAlso reader.TokenType <> JsonToken.EndObject
        ' process properties of the JSON object
    End While
End If

Другие вопросы по теме