【问题标题】:How to serilize/deserilize Json Object to C# class如何将 Json 对象序列化/反序列化为 C# 类
【发布时间】:2020-07-19 16:19:30
【问题描述】:

我有两个具有“resultObject”属性的 json 响应。其中一个返回了对象,另一个返回了字符串/布尔值。

我有一个使用 JSON 的 C# 对象。

public class UseInboxResult
{      

    public string version { get; set; }
    public bool resultStatus { get; set; }
    public int resultCode { get; set; }
    public string resultMessage { get; set; }
    public ResultObject resultObject { get; set; }
}

public class ResultObject
{        
    public string access_token { get; set; }
    public int expires_in { get; set; }
    public string token_type { get; set; }


    public int displayCount { get; set; }
    public int totalCount { get; set; }

    public List<Items> items { get; set; }
}

JSON 对象有不同类型的 resultObject 属性

    //First
{
  "version": "1.0.0",
  "resultStatus": true,
  "resultCode": 200,
  "resultMessage": "Your operation has been completed successfully.",
  "resultObject": {
    "displayCount": 1,
    "totalCount": 1,
    "items": [
      {
        "id": "5db72eec92b565000100a0aa",
        "createTime": "2019-10-28T18:09:48.924Z",
        "updateTime": "2019-12-20T18:10:41.451Z",
        "displayName": "John Doe",
        "email": "john.doe@example.com",
        "activation": true,
        "notifyDedicatedIps": null
      }
    ]
  }
}

//Second

{
  "version": "1.0.0",
  "resultStatus": false,
  "resultCode": 200,
  "resultMessage": "OK",
  "resultObject": "5e0491bdaf6d250001834b75"
}

如何为这个属性绑定一个 c# 类。

【问题讨论】:

  • 你知道你收到的是哪一个吗?这是否取决于您拨打的电话或您从哪里阅读?还是只是定义它的 resultStatus?
  • 如果 resultStatus: true 那么你有你预期的结果,否则返回 404 或错误?
  • 两个 jsons 来自不同的 servis url。 @Dunning-Kruger 其中一个是字符串、布尔值和其他类型的对象
  • @D.Dahlberg 我对结果 Status:true 不感兴趣,因为这些是示例 json 对象,我使用来自同一项目的不同 api 链接 reference.useinbox.com/…
  • @MertMetin 更新了我的答案。谢谢!

标签: c# json object serialization deserialization


【解决方案1】:

您可以使用泛型将它们拆分为单独的部分。

public class Response<T>
where T : class
{      

    public string version { get; set; }
    public bool resultStatus { get; set; }
    public int resultCode { get; set; }
    public T resultMessage { get; set; }
}

public class ResultObject
{        
    // Your same ResultObject.
}

您现在可以反序列化为 Response&lt;ResultObject&gt;Response&lt;string&gt;,具体取决于您调用的内容。

【讨论】:

  • 正如我上面提到的,这些 json 对象是样本,如果我得到成功响应,那就是真的
  • resultMessagetrue?然后只需使用Response&lt;bool&gt;
  • 我解决了我的问题。我使用了类似于上面的类结构,但结果对象的类型是一个对象而不是泛型类
【解决方案2】:

您可以将ResultObject 替换为object,然后检查resultStatus 如果resultStatus == trueresultObject 反序列化为ResultObject。 否则将resultObject反序列化为string

public class UseInboxResult
{      
    public string version { get; set; }
    public bool resultStatus { get; set; }
    public int resultCode { get; set; }
    public string resultMessage { get; set; }
    public object resultObject { get; set; }//<--NOTE THIS
}

var data = JsonConvert.DeserializeObject<UseInboxResult>(json);
//var data = System.Text.Json.JsonSerializer.Deserialize<UseInboxResult>(json); .Net Core 3
if (data.resultStatus == true)
{
      ResultObject result = JsonConvert.DeserializeObject<ResultObject>(data.resultObject.ToString());
}
else
{
    string result = JsonConvert.DeserializeObject<ResultObject>(data.resultObject.ToString());
}

【讨论】:

  • 我对结果 Status:true 不感兴趣,因为这些是示例 json 对象,我使用来自同一项目 @Farhad 的不同 api 链接
  • Newtonsoft.Json 对我最有帮助,因为 ResultObject 可以是可解析的 json 字符串并使用任何类型的对象类型。但是我没有使用 if 语句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多