23

我在使用 JSON.Net 创建时遇到了一些问题。当我尝试解析它时,它给了我以下错误:

阅读完 JSON 内容后遇到的附加文本:

我尝试使用http://json.parser.online.fr/验证它,它显示“SyntaxError: Unexpected token ”。

我的 JSON 如下:

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

如何反序列化它?

4

2 回答 2

31

您需要用方括号括起来,这表示它是一个数组:

    [{"StaffID":"S01","StaffRank":"Manager"},{"StaffID":"S02","StaffRank":"Waiter"}]
于 2013-05-27T03:19:50.950 回答
7

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()其中,然后将流通过文件分别反序列化每个对象。

于 2018-04-25T05:43:40.540 回答