Десериализовать свойство JSON в различные свойства класса - PullRequest
0 голосов
/ 09 мая 2019

Я получаю ответы API от сторонних производителей, которые имеют неоднозначные типы.Для некоторых методов это:

{"error":{"message":"Resource is already part of this app","status_code":400}}

А для других вызовов это:

{"error": "Resource is already part of this app" }

Возможно ли десериализовать такие ответы в нечто вроде:

public class Response
{
    [JsonProperty("error")]
    public string Error { get; set; }

    [JsonIgnore] //[JsonProperty("error")]
    public ObjectError ObjectError { get; set; }
}

public class ObjectError
{
    [JsonProperty("message")]
    public string Message { get; set; }

    [JsonProperty("status_code")]
    public string StatusCode { get; set; }
}

ОБНОВЛЕНИЕ

Таким образом, я в конечном итоге использовал объект в качестве catch all для десериализации.

    [JsonProperty("error")]
    public object Error { get; set; }

    public string ErrorAsString => Error is string ? Error.ToString() : null;

    public ObjectError ErrorAsObject => Error is string ? null : Error != null ? JsonConvert.DeserializeObject<ObjectError>(Error.ToString()) : null;

Это не идеально, я знаю.

1 Ответ

0 голосов
/ 09 мая 2019

Вы можете сделать это легко, используя NetwosoftJson. Здесь вы можете проверить, как десериализовать объект, используя его.

Вы всегда можете проанализировать объект JSON и проверить, есть ли у него определенные поля. Например:

JObject json = JObject.Parse(jsonString);

if(json.HasKey("message"))
{
    var result = JsonConvert.DeserializeObject<ObjectError>(jsonString);
    // Do some stuff here
}
else
{
    var result = JsonConvert.DeserializeObject<Response>(jsonString);
    // Do some stuff here
}
...