Разбор файла JSON с разделителями-запятыми

Я пытаюсь использовать Json.NET для анализа файла объектов JSON, разделенных запятыми:

{
   JSON ...
},
{
   JSON ...
},
{
   JSON ...
}

Приведенный ниже код отлично работает, если поток не содержит разделителей (т. е. запятые выше удалены). Однако запятые создают бесконечный цикл, в котором Json.NET продолжает считывать токен «Неопределенный» даже после достижения конца файла:

  using (StreamReader fReader = File.OpenText("filename.json"))
  using (JsonTextReader jReader = new JsonTextReader(fReader))
  {
    jReader.SupportMultipleContent = true;
    while (jReader.Read())
    {
      var jToken = JToken.ReadFrom(jReader);
      if (jToken is JObject)
        Console.WriteLine("JSON object: " + ((JObject)jToken).ToString());
    }
  }

Я попытался пропустить запятую, прочитав вперед и используя метод Skip() JsonTextReader, но это не работает: JsonTextReader, по-видимому, буферизуется вперед, съедая запятую, что вызывает несварение.

Трудно поверить, что я первый столкнусь с этой проблемой, но, несмотря на то, что я долго искал здесь, я не нашел подходящих сообщений (по крайней мере, для C# и Json.NET). Действительно ли необходимо взломать это с нуля?

ETA: Согласно комментарию Брайана Роджерса ниже, Json.NET 11.0.1 и выше обрабатывают JSON с разделителями-запятыми, поэтому вышеизложенное теперь работает нормально, запятые или нет.


person Paul Lambert    schedule 03.02.2019    source источник
comment
Для меня это похоже на проблему XY. Лучше не создавать недопустимые файлы JSON в первую очередь.   -  person Uwe Keim    schedule 03.02.2019
comment
Да, но эти файлы поступают из внешнего источника, который я не контролирую (я понимаю, что они искажены). Я был бы более чем счастлив отказаться от моего предпринятого решения, если бы был превосходный подход.   -  person Paul Lambert    schedule 03.02.2019
comment
Обновите до Json.Net 11.0.1 или новее. Он поддерживает то, что вы пытаетесь сделать, используя настройку SupportMultipleContent на ридере. См. второй ответ связанного повторяющегося вопроса.   -  person Brian Rogers    schedule 03.02.2019


Ответы (1)


Один из способов приблизиться к этому — составить список. Например, вы можете добавить «[» «]» к любому концу «Json, разделенного запятыми», чтобы преобразовать его в список, а затем десериализовать его.

Например, рассмотрим следующий код, в котором объекты Json разделены запятой (для простоты создан простой json, но он может работать и иначе)

var jsonString = @"{User:'anu viswan', Location:'India'},{User:'User2', Location:'India'}";

Если вы добавите «[» «]» в любой конец, а затем сериализуете его, вы можете получить коллекцию RootObjects.

var result = JsonConvert.DeserializeObject<RootObject[]>($"[{jsonString}]");

В данном конкретном случае RootObject определяется как

public class RootObject
{
    public string User { get; set; }
    public string Location { get; set; }
}

Аналогичным образом вы можете преобразовать Json в коллекцию на основе вашего определения объекта.

person Anu Viswan    schedule 03.02.2019