Дополнительный текст, полученный после завершения чтения содержимого JSON:

У меня возникли некоторые проблемы с созданием с JSON.Net. Когда я пытаюсь разобрать его, он выдает следующую ошибку:

Дополнительный текст обнаружен после завершения чтения содержимого JSON:

Я попытался проверить его с помощью http://json.parser.online.fr/ и там написано: "SyntaxError: неожиданный токен".

Мой JSON как ниже:

{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}

Как его десериализовать?

Ответ 1

Вам нужно окружить это квадратными скобками, что означает, что это массив:

    [{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]

Ответ 2

Начиная с Выпуска 11.0.1, Json.NET теперь изначально поддерживает синтаксический анализ JSON, разделенный запятыми, так же, как он поддерживает синтаксический анализ JSON:

Новая функция - добавлена поддержка чтения нескольких значений через запятую с помощью JsonReader.SupportMultipleContent.

Таким образом, ответ на сериализацию и десериализацию json с разделителями строк Ювалом Ицхаковым должен работать и здесь. Определите метод расширения:

public static partial class JsonExtensions
{
    public static IEnumerable<T> FromDelimitedJson<T>(TextReader reader, JsonSerializerSettings settings = null)
    {
        using (var jsonReader = new JsonTextReader(reader) { CloseInput = false, SupportMultipleContent = true })
        {
            var serializer = JsonSerializer.CreateDefault(settings);

            while (jsonReader.Read())
            {
                if (jsonReader.TokenType == JsonToken.Comment)
                    continue;
                yield return serializer.Deserialize<T>(jsonReader);
            }
        }
    }
}

Затем, учитывая модель данных, созданную для хранения отдельного элемента в списке через запятую, например:

public class RootObject
{
    public string StaffID { get; set; }
    public string StaffRank { get; set; }
}

Вы можете десериализовать строку JSON, показанную так:

var jsonString = @"{""StaffID"":""S01"",""StaffRank"":""Manager""},{""StaffID"":""S02"",""StaffRank"":""Waiter""}";

var list = JsonExtensions.FromDelimitedJson<RootObject>(new StringReader(jsonString)).ToList();

Этот подход может быть предпочтительным при десериализации очень большой последовательности объектов, разделенных запятыми, из большого файла, поскольку нет необходимости загружать весь файл в string затем добавлять '[' и ']' в начало и конец. В советах по повышению производительности: оптимизируйте использование памяти Newtonsoft рекомендует десериализовать большие файлы непосредственно из потока, поэтому вместо этого StreamReader может быть передан в JsonExtensions.FromDelimitedJson() который затем будет проходить через файл, десериализуя каждый объект отдельно.