2015-02-19 3 views
0

У меня есть следующие JSON строку:Как десериализации объект JSON в классе

private const string Json = @"{ 
     'responseMessage': '', 
     'response': 'PASS', 
     'responseData': { 
      'user': { 
      'initials': 'XXX', 
      'name': 'XXXX XXXX', 
      'companies': [ 
       '0002', 
       '0007', 
       '0022', 
       '0033', 
       '9999' 
      ], 
      'employee': 'XXXX' 
      } 
     }, 
     'responseFor': 'myCommand' 
    }'"; 

Мой класс ServerResponse выглядит следующим образом:

[JsonObject(MemberSerialization.OptIn)] 
public class ServerResponse 
{ 
    [JsonProperty("responseFor")] 
    public string ResponseFor { get; set; } 

    [JsonProperty("responseData")] 
    public string ResponseData { get; set; } 

    [JsonProperty("response")] 
    public string Response { get; set; } 

    [JsonProperty("responseMessage")] 
    public string ResponseMessage { get; set; } 
} 

Я называю эту команду:

var serverResponse = JsonConvert.DeserializeObject<ServerResponse>(Json); 

Я бы ожидал, что это заполнит мой объект serverResponse, но вместо этого я получаю это исключение:

{Newtonsoft.Json.JsonReaderException: Error reading string. Unexpected token: StartObject. Path 'responseData', line 4, position 30. 
    at Newtonsoft.Json.JsonReader.ReadAsStringInternal() [0x00000] in <filename unknown>:0 
    at Newtonsoft.Json.JsonTextReader.ReadAsString() [0x00000] in <filename unknown>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonContract contract, Boolean hasConverter) [0x00000] in <filename unknown>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject (System.Object newObject, Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, System.String id) [0x00000] in <filename unknown>:0 } 

Что я здесь делаю неправильно?

+3

'responseData' не является строкой, это объект с несколькими полями. –

+0

Что бы определить ResponseData как в моем классе ServerResponse? Я уже пробовал Список ResponseData. – PkL728

+0

Это не список строк. Это объект. С полями. Как я уже сказал. –

ответ

1

Для выполнения сериализации нужен класс для ResponseData, так как значение для него в json не является строкой. Вам также понадобится один для пользователя.

Создайте ответы и пользовательские классы, которые выглядят примерно так.

[JsonObject(MemberSerialization.OptIn)] 
public class User 
{ 
    [JsonProperty("initials")] 
    public string Initials { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 

    [JsonProperty("companies")] 
    public string[] Companies { get; set; } 

    [JsonProperty("responseMessage")] 
    public string ResponseMessage { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class ResponseData 
{ 
    [JsonProperty("user")] 
    public User User { get; set; } 

    [JsonProperty("employee")] 
    public string Employee { get; set; } 
} 

Затем в вашем классе ServerResponse измените ResponseData, чтобы использовать этот класс ResponseData.

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