2013-03-12 3 views
2
return jsSerializer.Deserialize<MamDataResponseHolder>(stringJson); 

бросает исключение:JSON десериализации объекта не удается

типа «System.String» не поддерживается для десериализации массива.

Но я не вижу проблемы.

public class MamDataResponseHolder 
    { 
     public MamDataResponsePair[] configuration { get; set; } 
     public string Status { get; set; } 
    } 

    public class MamDataResponsePair 
    { 
     public string id { get; set; } 
     public MamDataResponsecriteria[] criterias { get; set; } 
    } 

public class MamDataResponsecriteria 
    { 
     public Guid criteriaId { get; set; } 
     public string[] domains { get; set; } 
     public string domainsException { get; set; } 
    } 

А вот JSON:

{ 
     "configuration": [{ 
      "id": "Coupon Body", 
      "criterias": [{ 
       "criteriaId": "c7150fc2-72b9-4628-a199-dd5c0bdeef1b", 
       "domains": [""], 
       "domainsException": [""] 
      }] 
     }], 
     "Status": "succeeded" 
    } 
+0

'«domainsException»: [«»]' - это сериализованная как массив, но в модели это строка –

ответ

2

Ваша модель и ваш Json не совпадают. Взгляните на domainsException. В вашем Json это явно массив строк, но в вашей модели это просто строка.

Кроме того: Вы уверены, что хотите [""] в своем Json? Таким образом вы получаете массив с пустой строкой вместо пустого массива.

1

Ваши классы должны быть, как показано ниже:

public class Criteria 
{ 
    public string criteriaId { get; set; } 
    public List<string> domains { get; set; } 
    public List<string> domainsException { get; set; } 
} 

public class Configuration 
{ 
    public string id { get; set; } 
    public List<Criteria> criterias { get; set; } 
} 

public class RootObject 
{ 
    public List<Configuration> configuration { get; set; } 
    public string Status { get; set; } 
} 
+1

Почему? Нет необходимости переименовывать классы и использовать List вместо массивов. Кроме того, вы даже не упомянули точную проблему. – JustAnotherUserYouMayKnow

+0

Да нет необходимости переименовывать классы, но это хорошая практика, чтобы сохранить имя так же, как вы получаете ответ, потому что если вы снова сериализуете его позже, вы можете получить то же самое, что и входная строка. – Popeye

+0

Тогда вы действительно должны упомянуть о своем намерении в своем ответе. – JustAnotherUserYouMayKnow

Смежные вопросы