【问题标题】:Deserialize JSON property into different class properties将 JSON 属性反序列化为不同的类属性
【发布时间】:2019-05-09 12:47:56
【问题描述】:

我收到来自第 3 方的类型不明确的 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; }
}

更新

所以我最终使用对象作为反序列化的全部。

    [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;

这并不理想,我知道。

【问题讨论】:

  • 是否有不止一种类型的响应?如果没有那么也许你可以做一个if indexOf("status_code") != -1 then ObjectError else Response
  • @phuzi 你是对的,我正在更新我的问题。

标签: c# json.net deserialization json-deserialization


【解决方案1】:

您可以使用 NetwosoftJson 轻松完成此操作。 Here你可以查看如何使用它反序列化成一个对象。

您始终可以解析 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
}

【讨论】:

  • 我知道如何使用 NewtonSoft Json 反序列化对象。问题是相同的属性有时是对象,有时是字符串。
  • 只有这两个选项还是有更多变化?
  • 到目前为止我遇到的只有这两个。
  • 是的,这也可以。我将不得不重构一些代码。不理想,但可行。谢谢。
  • 我不建议反序列化两次。使用 json.ToObject() 将其转换为 if 语句。还有wdym不理想?您期待什么样的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2012-08-19
  • 2013-04-09
相关资源
最近更新 更多