我在使用JSON.Net创建时遇到了一些问题。当我尝试解析它时,它会给我以下错误:
完成阅读JSON内容后遇到的其他文字:
我尝试用http://json.parser.online.fr/验证它,并说“SyntaxError:Unexpected token”。
我的JSON如下:
{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}
如何反序列化?
答案 0 :(得分:25)
你需要用方括号括起来,这表示它是一个数组:
[{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]
答案 1 :(得分:2)
从Release 11.0.1开始,Json.NET现在本身支持以与支持解析newline delimited JSON相同的方式解析逗号分隔的JSON:
新功能 - 添加了使用
JsonReader.SupportMultipleContent
读取多个逗号分隔值的支持。
因此Line delimited json serializing and de-serializing对Yuval Itzchakov的回答也适用于此。定义扩展方法:
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
然后添加'['
和{ {1}}到开头和结尾。在Performance Tips: Optimize Memory Usage中,Newtonsoft建议直接从流中反序列化大型文件,因此可以将']'
传递到StreamReader
,然后通过文件流式传输,逐个反序列化每个对象。