【问题标题】:Additional text encountered after finished reading JSON content:阅读完 JSON 内容后遇到的附加文本:
【发布时间】:2013-05-27 03:18:47
【问题描述】:

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

读取完 JSON 内容后遇到的额外文字:

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

我的 JSON 如下:

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

如何反序列化?

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

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

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

    【讨论】:

    • 在我尝试之后,我得到了一个新错误:“无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'tbl_Staff',因为该类型需要 JSON 对象(例如{"name":"value"}) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化的类型更改为数组或实现了一个集合接口(例如 ICollection、IList),例如可以从 JSON 数组反序列化的 List。也可以将 JsonArrayAttribute 添加到类型中以强制它从 JSON 数组反序列化。"
    • 帮助他而不是全部输入大写字母怎么样。有时人们在开始时不知道如何读取 JSON。
    【解决方案2】:

    Release 11.0.1 开始,Json.NET 现在原生支持解析逗号分隔的 JSON,就像它支持解析 newline delimited JSON 一样:

    新功能 - 添加了对使用 JsonReader.SupportMultipleContent 读取多个逗号分隔值的支持。

    因此,Yuval ItzchakovLine delimited json serializing and de-serializing 的回答也应该在这里起作用。定义扩展方法:

    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 中,然后将 '['']' 添加到始末。在 Performance Tips: Optimize Memory Usage 中,Newtonsoft 建议直接从流中反序列化大文件,因此可以将 StreamReader 传递给 JsonExtensions.FromDelimitedJson(),然后将流通过文件分别反序列化每个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      相关资源
      最近更新 更多