Я прочитал пару подобных вопросов, но не нашел ни одного связанного с JObject. Вот проблема: У меня есть поток с каскадными объектов JSON, то есть:Загрузка нескольких связанных объектов JSON из потока
{"key1":"value1"}{"key2":"value2"}{"key3":"value3"}
Теперь я хочу, чтобы читать эти объекты один за другим в JObject. Вот как я пытался сделать это:
public class JsonStreamReader : JsonTextReader
{
public JsonStreamReader(Stream s) : base(new StreamReader(s)) {}
}
private void LoadJson(Stream s)
{
var r = new JsonStreamReader(s) { SupportMultipleContent = true };
var obj = JObject.Load(r);
// ... get data from JObject ...
}
Проблема здесь состоит в том, что JObject.Load() считывает все доступные данные из потока, но разбирает только первый объект и отбрасывает все остальные. Как мне с этим справиться?
И только в случае XY-проблемы (зачем мне это нужно): Я хочу передавать сообщения JSON через поток TCP. Поскольку я использую необработанный поток TCP, мне нужно знать размер сообщения, чтобы прочитать его. Я решил написать небольшой заголовок с size
и message type
перед каждым сообщением, поэтому я могу прочитать заголовок в небольшой буфер, получить размер следующего сообщения, а затем прочитать его полностью.
Есть ли способ, которым вы можете обернуть ваши объекты JSON в массив и запятую - отделить их? – krillgar
@krillgar, чтобы это был единственный объект? – nitrocaster
Разве это буквальный json? Большинство API с таким форматом данных предоставляют объектам json новую строку с разделителями, поэтому правильный способ ее обработки состоит в том, чтобы читать ее по строкам, передавая каждый в JObject.Load (может потребоваться другой метод), а не пытаться сделать все это однажды. – evanmcdonnal