Как сериализовать / десерилизовать Json Объект до C# класса - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть два json ответа, которые имеют свойство "resultObject". Один из них возвратил объект, другой возвратил строку / bool.

У меня есть C# объект, который использует JSON.

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# для этого свойства.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вы можете разделить их на отдельные части с помощью обобщенного c.

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<ResultObject> или Response<string> в зависимости от того, что вы звоните.

1 голос
/ 07 апреля 2020

Вы можете заменить ResultObject на object, затем отметьте resultStatus, если resultStatus == true десериализовать resultObject в 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());
}

...