【发布时间】:2015-02-16 13:03:36
【问题描述】:
我在单个文件中有一堆长的 json 输出。我需要读取这些文件并将它们反序列化为最初生成 json 的实体(我可以访问原始实体)。每个文件都有通过序列化 IEnumerable<Response<MyEntity>> 类型的对象生成的 json 输出。
我在尝试反序列化时遇到异常,但我不明白为什么。这是我反序列化的尝试:
List<string> jsonOutputStrings;
// Read json from files and populate jsonOutputStrings list
List<Response<MyEntity>> apiResponses = new List<Response<MyEntity>>();
foreach (string json in jsonOutputStrings)
{
apiResponses.AddRange(JsonConvert.DeserializeObject<List<Response<MyEntity>>>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }).ToList());
}
我还尝试反序列化为 IEnumerable 而不是列表:
apiResponses.AddRange(JsonConvert.DeserializeObject<IEnumerable<Response<MyEntity>>>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }).ToList());
我得到以下异常:
类型的第一次机会异常 'Newtonsoft.Json.JsonSerializationException' 发生在 Newtonsoft.Json.dll
附加信息:无法创建和填充列表类型 System.Linq.Enumerable+WhereSelectListIterator`2[Entities.Requirement,Entities.RequirementEntity]。 小路 '$values[0].ReturnedEntity.Summaries.$values[0].Requirements.$values', 第 1 行,位置 715。
整个 json 太长,无法发布(并且还包含一些机密数据),但我确实在 json 中找到了一个位置:
"Requirements":{"$id":"7","$type":"System.Linq.Enumerable+WhereSelectListIterator`2[[Entities.Requirement, Entities],[Entities.RequirementEntity, API.Entities]], System.Core","$values":[...]}
在我尝试反序列化的实体(与最初序列化的实体相同)中,Requirements 的类型为 IEnumerable<Entities.RequirementEntity>。
MyEntity 的序列化如何工作对我来说没有意义,但反序列化为相同类型却没有。我该如何解决这个问题?
【问题讨论】:
-
您是否尝试反序列化为
IEnumerable<ApiResponse<StudentReportApiEntity>>>? -
是的,这就是我首先做的。我仍然得到同样的错误。
IEnumerable<Entities.RequirementEntity>属性似乎有问题,该属性嵌套在父实体中的多个级别,但我不知道为什么...... -
这可能是一个愚蠢的问题,但是您要反序列化的 List 类型的命名空间是什么? System.Collections...?
-
如果您从序列化结果中排除该类型,那么它对您有用吗? (检查
TypeNameHandling设置) -
@AndrewWhitaker - 谢谢!当我在反序列化时将 TypeNameHandling 设置为 None 时,它起作用了。
标签: c# json linq serialization json.net