Ответ 1
Вам нужно окружить это квадратными скобками, что означает, что это массив:
[{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]
У меня возникли некоторые проблемы с созданием с JSON.Net. Когда я пытаюсь разобрать его, он выдает следующую ошибку:
Дополнительный текст обнаружен после завершения чтения содержимого JSON:
Я попытался проверить его с помощью http://json.parser.online.fr/ и там написано: "SyntaxError: неожиданный токен".
Мой JSON как ниже:
{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}
Как его десериализовать?
Вам нужно окружить это квадратными скобками, что означает, что это массив:
[{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]
Начиная с Выпуска 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()
который затем будет проходить через файл, десериализуя каждый объект отдельно.