Один из API JSON, который я потребляю, возвращает ответ, который меняет структуру данных в зависимости от того, сколько результатов возвращается из запроса. Я потребляю его из C# и используя JSON.NET для десериализации ответа.Deserialize JSON с переменной структурой данных
Вот JSON, который возвращается из API
Multiple Результат Ответ:
{
"response": {
"result": {
"Leads": {
"row": [
{
"no": "1",
...
...
...
Single Результат Ответ:
{
"response": {
"result": {
"Leads": {
"row": {
"no": "1",
...
...
...
Обратите внимание на разницу в «строке ", который является либо массивом в случае нескольких результатов и объекта в случае единственного результата.
Вот классы, которые я использую для десериализации эти данные
Классы:
public class ZohoLeadResponseRootJson
{
public ZohoLeadResponseJson Response { get; set; }
}
public class ZohoLeadResponseJson
{
public ZohoLeadResultJson Result { get; set; }
}
public class ZohoLeadResultJson
{
public ZohoDataMultiRowJson Leads { get; set; }
}
public class ZohoDataMultiRowJson
{
public List<ZohoDataRowJson> Row { get; set; }
}
public class ZohoDataRowJson
{
public int No { get; set; }
...
}
«Multiple Результат ответа» десериализируется без каких-либо проблем, но когда есть только один результат в ответе , из-за изменения структуры данных ответ не может быть десериализован. Я получаю исключение
Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON
object (e.g. {"name":"value"}) into type
'System.Collections.Generic.List`1[MyNamespace.ZohoDataRowJson]'
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3])
or change the deserialized type so that it is a normal .NET type (e.g. not a
primitive type like integer, not a collection type like an array or List<T>)
that can be deserialized from a JSON object. JsonObjectAttribute can also be
added to the type to force it to deserialize from a JSON object.
Path 'response.result.Notes.row.no', line 1, position 44.
Есть ли способ справиться с этим в Json.Net с некоторым атрибутом и, надеюсь, без необходимости писать конвертер?
Спасибо @ L.B за ссылку и ответ в связанном вопросе. –
Другой подобный вопрос http://stackoverflow.com/questions/18994685/how-to-handle-both-a-single-item-and-an-array-for-the-same-property-using-json-n –
@ФУНТ в ReadJson reader.ValueType всегда null. В этом случае мне пришлось использовать reader.TokenType, который является StartArray или StartObject. Кроме того, в обоих случаях десериализация будет продолжаться. Я хотел бы опубликовать ответ, поскольку он немного отличается от обоих связанных ответов. Я также хотел бы назвать поставщика, чтобы это могло помочь будущим пользователям работать в одной и той же проблеме. –