DataContractJsonSerializer и файлы, в которых отсутствует [] - PullRequest
0 голосов
/ 11 сентября 2018

Я сейчас попробовал разные подходы, но все они, похоже, приводят к одной и той же проблеме парсинга.

Если я получаю обратный вызов с объектом 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 не распознает его?

Есть ли какие-то настройки, которые я полностью пропустил в своем трехдневном поиске ..

Мой список объектов выглядит так:

[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; }

1 Ответ

0 голосов
/ 11 сентября 2018

Причина в том, что первая версия не действительна в контексте того, что вы пытаетесь десериализовать.Если вы хотите десериализовать список, 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) };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...