我现在尝试了不同的方法,但是它们似乎都导致了相同的解析问题。
如果我收到包含Json对象的回调,并且尝试解析它,如下所示:
var jsonSerializer = new DataContractJsonSerializer(typeof(List<Jsons>));
var oAllJsons = (List<Jsons>)jsonSerializer.ReadObject(oStream);
然后,我将获得其中一个将解析的响应,另一个将不解析。
这个Json片段不会解析:
{
"summary": {
"durationInSeconds": 2889,
"startTimeInSeconds": 1536486220
}
}
这个Json代码段可以解析:
{
"summary": [{
"durationInSeconds": 2889,
"startTimeInSeconds": 1536486220
}]
}
我想念什么? 出于某种原因,为什么要在回调中手动添加[]。
两个Jsons都是有效的,那么DataContractJsonSerializer为什么不能识别它?
在3天的搜索中,我是否完全错过了某些设置。
我的列表对象如下:
[DataMember(Name = "userAccessToken")]
public string UserAccessToken { get; set; }
[DataMember(Name = "summaryId")]
public string SummaryId { get; set; }
[DataMember(Name = "summary")]
public List<ADetail_Summary> Summary = new List<ADetail_Summary>();
[DataMember(Name = "samples")]
public List<ADetail_Sample> Sample = new List<ADetail_Sample>();
摘要看起来至少是这样的:
[DataMember(Name = "durationInSeconds")]
public int DurationInSeconds { get; set; }
[DataMember(Name = "startTimeInSeconds")]
public int StartTimeInSeconds { get; set; }
[DataMember(Name = "startTimeOffsetInSeconds")]
public int StartTimeOffsetInSeconds { get; set; }
[DataMember(Name = "activityType")]
public string ActivityType { get; set; }
答案 0 :(得分:1)
原因是因为在您要反序列化的内容中,第一个版本无效。如果要反序列化到列表,则JSON必须是对象数组。否则,它将失败。就那么简单。老实说,无论您要张贴一个还是多个对象,您的有效载荷都应该标准化。对于单个对象,您仍然可以拥有一个包含单个项目的数组。当您开始尝试为同一功能接受不同的格式时,就会遇到问题。
但是,如果您坚持,那么最好的建议是使用try..catch
来捕获JSON不是数组时引发的异常,然后将其解析为单个对象:
var jsonSerializer = new DataContractJsonSerializer(typeof(List<Jsons>));
List<Jsons> oAllJsons;
try
{
oAllJsons = (List<Jsons>)jsonSerializer.ReadObject(oStream);
}
catch (Exception) // use actual specific exception here
{
oAllJsons = new List<Jsons> { (Jsons)jsonSerializer.ReadObject(oStream) };
}