完成阅读JSON内容后遇到的其他文本:

时间:2013-05-27 03:18:47

标签: c# json json.net

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

  

完成阅读JSON内容后遇到的其他文字:

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

我的JSON如下:

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

如何反序列化?

2 个答案:

答案 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-serializingYuval 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,然后通过文件流式传输,逐个反序列化每个对象。