Итак, в настоящее время я использую 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 Я просто читаю до последнего свойства, а затем добавляю следующую строку в словарь. Действительно хакерский.
В чем именно проблема? У меня 25 мсек до JObject.Parse (YourJson). Как быстро ты этого хочешь?
Тогда вам, вероятно, понадобится собственный парсер. Вероятно, вы можете разделить строку с помощью '{', '}'
и проанализировать отдельные части.
@CruleD, как я уже сказал, процесс отражения идет слишком медленно. В настоящее время я использую специальный синтаксический анализатор, рекомендованный Slai, и теперь он обрабатывает его почти в 3 раза быстрее. Использование JObject.Parse в два раза медленнее по сравнению с использованием JSonTextReader и построчным чтением.
Так это занимает 8 мс?
JSonTextReader
по-прежнему имеет много накладных расходов по сравнению с полностью настраиваемым парсером. Если нужно, чтобы это было еще быстрее, другим вариантом может быть настройка .NET JavaScriptObjectDeserializer
или другого кода синтаксического анализа.
@CruleD Пользовательский синтаксический анализ занимает 5 мс. JSON.NET занимает 25 мс. JObject.Parse занимает 11 мс. Мне просто нужно максимально быстрое решение, поскольку оно имеет дело с данными в реальном времени и как быстро мы можем подготовить его и подготовить к работе. Единственная причина, по которой я даже спрашиваю о чем-то еще, помимо кастомного, заключается в том, что это не кажется очень удобным в обслуживании в отличие от сериализации, но похоже, что это просто компромисс.
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