我现在尝试了不同的方法,但它们似乎都会导致相同的解析问题。
如果我收到一个包含 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
}]
}
我错过了什么? 如果它们丢失,为什么我必须手动添加 [],无论回调中出于何种原因。
两个 Json 都是有效的,那么为什么 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; }
原因是因为第一个版本在您尝试反序列化的上下文中无效。如果要反序列化为列表,则 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) };
}