我在使用 JSON.Net 创建时遇到了一些问题。当我尝试解析它时,它给了我以下错误:
阅读完 JSON 内容后遇到的附加文本:
我尝试使用http://json.parser.online.fr/验证它,它显示“SyntaxError: Unexpected token ”。
我的 JSON 如下:
{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}
如何反序列化它?
我在使用 JSON.Net 创建时遇到了一些问题。当我尝试解析它时,它给了我以下错误:
阅读完 JSON 内容后遇到的附加文本:
我尝试使用http://json.parser.online.fr/验证它,它显示“SyntaxError: Unexpected token ”。
我的 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
。
因此,Yuval Itzchakov 对Line delimited 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
可以将 a 传入JsonExtensions.FromDelimitedJson()
其中,然后将流通过文件分别反序列化每个对象。