2016-03-17 30 views
1

我有一個使用API​​方法的服務,它返回一個json字符串。我有低於基準響應對象:具有數組屬性的類的JArray對象

public class BaseResponse 
{ 
    public bool HasError { get; set; } 
    public string Message { get; set; } 
} 

和通用型分析器

Task<R> ParseResponse<R>(HttpResponseMessage response) where R : BaseResponse, new() 

返回:

return JsonConvert.DeserializeObject<R>(responseText);  

請注意,我沒有控制權的響應API。所以我得到了這個響應,一組對象。

[{"created":"0001-01-01T00:00:00","updated":null,"name":"Test 1","decscription":null,"id":1},{"created":"0001-01-01T00:00:00","updated":null,"name":"Test 2","decscription":null,"id":2},{"created":"0001-01-01T00:00:00","updated":null,"name":"Test 3","decscription":null,"id":3},{"created":"0001-01-01T00:00:00","updated":null,"name":"Test 4","decscription":null,"id":4}] 

問題是,我想將其解析到這個類:

public class TestResponse : BaseResponse 
{ 
    public Test[] Tests { get; set; } 
} 

HasErrorMessage的值都將在服務器上發生錯誤或API返回一個錯誤的請求等。

任何信息將不勝感激。謝謝。

+0

你想爲'HasError'和'Message'做些什麼?他們不在JSON中。 – dbc

+0

@dbc當服務器發生錯誤或api返回了「錯誤請求」時,「HasError」和「Message」將會有值。 – jeiem

回答

0

從您的評論中,聽起來好像一個成功的響應將顯示爲JSON數組,但是如果發生錯誤,那麼將返回帶有錯誤標誌和消息的JSON對象。爲了解析兩個可能的響應,則可以創建一個custom JsonConverter,檢查所接收的JSON是否是一個數組或一個對象,並相應地繼續進行:

public class TestResponseConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(TestResponse); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     else if (reader.TokenType == JsonToken.StartArray) 
     { 
      // A valid response. Populare the Tests array. 
      var tests = serializer.Deserialize<Test[]>(reader); 
      return new TestResponse { Tests = tests }; 
     } 
     else if (reader.TokenType == JsonToken.StartObject) 
     { 
      // An error response. Populate HasError and Message 
      var response = new TestResponse(); 
      serializer.Populate(reader, response); 
      return response; 
     } 
     else 
     { 
      throw new JsonSerializationException("Unexpected reader.TokenType: " + reader.TokenType); 
     } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var test = (TestResponse)value; 
     if (test.HasError && test.Tests != null && test.Tests.Length > 0) 
     { 
      serializer.Serialize(writer, new { HasError = test.HasError, Message = test.Message, Tests = test.Tests }); 
     } 
     else if (test.HasError || test.Tests == null) 
     { 
      serializer.Serialize(writer, new { HasError = test.HasError, Message = test.Message }); 
     } 
     else 
     { 
      serializer.Serialize(writer, test.Tests); 
     } 
    } 
} 

然後,它適用於使用JsonConverterAttribute類像這樣:

[JsonConverter(typeof(TestResponseConverter))] 
public class TestResponse : BaseResponse 
{ 
    public Test[] Tests { get; set; } 
} 

或將其添加到JsonSerializerSettings像這樣:

var settings = new JsonSerializerSettings { Converters = new[] { new TestResponseConverter() } }; 
var response = JsonConvert.DeserializeObject<R>(responseText, settings); 

原型fiddle

+0

謝謝。它使我找到了正確的解決方案。 – jeiem

相關問題