数据合同Json序列化程序和缺少[ ]的文件



我现在尝试了不同的方法,但它们似乎都会导致相同的解析问题。

如果我收到一个包含 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) };
}

最新更新