2016-05-11 5 views
1

Я пытаюсь сопоставить ответ JSON классу C# с помощью RestSharp. Я могу правильно отобразить почти все поля из ответа, однако есть несколько, а именно поля атрибутов, которые помечены как null. Мне интересно, есть ли что-то особенное, что мне нужно сделать, чтобы справиться с этими случаями.Сопоставление атрибута JSON с пользовательским классом C#

Возвращение JSON выглядит следующим образом:

{ 
    "Response": { 
     "@VersionNumber": "5.0", 
     "ResponseDetail": { 
      "CriteriaText": { 
       "$": "Name" 
       } 
     } 
     "ResultQuantity": 1, 
     "Result": [ 
       { 
       "Id": "1234567890", 
       "PrimaryName": { 
       "OrganizationName": { 
        "$": "CompanyName" 
        } 
       } 
       } 
     } 
} 

Я могу тянуть все корректно данные, кроме всего, что является атрибутом (начинается с @ или $).

Вот как я пытаюсь отобразить ответ:

public class Response 
{ 
    public string VersionNumber { get; set; } 
    public ResponseDetail ResponseDetail { get; set; } 
    public Result Result { get; set; } 
} 

Я попытался добавить это выше VersionNumber [JsonProperty("@VersionNumber")], однако, что не увенчалась успехом, а также.

Вот мой вызов GET:

public Response GetData(string endpoint) 
     { 
      RestRequest request = new RestRequest(Method.GET) 
      { 
       RequestFormat = DataFormat.Json, 
       Resource = _version + endpoint, 
       RootElement = "Response" 
      }; 
      request.AddHeader("Authorization", _token); 

      var response = _client.Execute<Response>(request); 

      if (response == null || !PassCodes.Contains(response.StatusCode)) 
      { 
       return null; 
      } 

      return response.Data; 
     } 

Любые мысли были бы полезны, спасибо заранее!

ответ

0

Я смог добиться того, что искал, выполнив замену простой строки. Я удалил любой ведущий @, а также переименовал любой сингл «$» в значение.

request.OnBeforeDeserialization = (x => 
     { 
      x.Content = x.Content.Replace("\"@", "\"").Replace("\"$\"","\"Value\""); 
     }); 
3

Чтобы использовать атрибут Newtonsoft.Json.JsonProperty, вам необходимо переключить RestSharp с собственного сериализатора на Newtonsoft.Json. Посмотрите на этот код в качестве основы: http://bytefish.de/blog/restsharp_custom_json_serializer/.

public class NewtonsoftJsonSerializer : IJsonSerializer 
{ 
    private Newtonsoft.Json.JsonSerializer serializer; 

    public NewtonsoftJsonSerializer(Newtonsoft.Json.JsonSerializer serializer) 
    { 
     this.serializer = serializer;   
    } 

    public string ContentType { 
     get { return "application/json"; } // Probably used for Serialization? 
     set { } 
    } 

    public string DateFormat { get; set; } 

    public string Namespace { get; set; } 

    public string RootElement { get; set; } 

    public string Serialize(object obj) 
    { 
     using (var stringWriter = new StringWriter()) 
     { 
      using (var jsonTextWriter = new JsonTextWriter(stringWriter)) 
      { 
       serializer.Serialize(jsonTextWriter, obj); 

       return stringWriter.ToString(); 
      } 
     } 
    } 

    public T Deserialize<T>(RestSharp.IRestResponse response) 
    { 
     var content = response.Content; 

     using (var stringReader = new StringReader(content)) 
     { 
      using (var jsonTextReader = new JsonTextReader(stringReader)) 
      { 
       return serializer.Deserialize<T>(jsonTextReader); 
      } 
     } 
    } 

    public static NewtonsoftJsonSerializer Default 
    { 
     get 
     { 
      return new NewtonsoftJsonSerializer(new Newtonsoft.Json.JsonSerializer() 
      { 
       NullValueHandling = NullValueHandling.Ignore, 
      }); 
     } 
    } 
} 

Если последняя версия RestSharp используется, вам нужно добавить без параметров CTOR:

public NewtonsoftJsonSerializer() 
{ 
    this.serializer = new JsonSerializer(); 
} 

и зарегистрировать NewtonsoftJsonSerializer как:

client.AddHandler("application/json", new NewtonsoftJsonSerializer()); 

И тогда JsonProperty будет работать:

[JsonProperty("@Foo")] 
public string Foo { get; set; } 
[JsonProperty("$")] 
public string Bar { get; set; } 
+0

Это полезно знать. Я могу сделать это. Есть ли лучший подход к моему вопросу или это, вероятно, лучший выбор? –

+0

@KevinMee, рекомендуется (и, возможно, единственный) способ настройки сериализации (как описано в readme: https://github.com/restsharp/RestSharp/blob/master/readme.txt). И он является гибким: может использоваться любая инфраструктура JSON, а не только Json.NET. –

+0

благодарю вас за ответ. Я работаю над реализацией этого, но, похоже, во время моего тестирования, что теперь я не получаю данные от ответа (он все еще существует в части контента). Я что-то упустил? –