【问题标题】:c# : Deserialize json Objectc# : 反序列化 json 对象
【发布时间】:2018-06-29 11:06:34
【问题描述】:

我正在调用一个 api,成功后我将获取列表格式的 json 数据

[

    {

        "fileName": [
            "file1"
        ],
        "date": [
            "8/25/2015 0:00"
        ],
        "time": [
            "7/16/2009 16:51"
        ],
        "id": "1",
        "version_": 1},
    {

        "fileName": [
            "file1"
        ],
        "date": [
            "8/25/2015 0:00"
        ],
        "time": [
            "7/16/2009 16:51"
        ],
        "id": "1",
        "version_": 1
    }
    ]

出错时,当我传递错误数据时,响应为纯 json 格式

{
   "resultType": "error",
   "errorType": "validationError",
   "errorCode": "validation.error",
   "apiMessage": "Data Validation issue, please correct the data and try again",
   "validationErrors":    [
            {
         "errorCode": "100211",
         "path": "firstName",
         "apiMessage": "Minimum field length not reached"
      },
            {
         "errorCode": "100241",
         "path": "firstName",
         "apiMessage": "Names must have at least one alphabetic character"
      }
   ],
   "requestId": "3f6fb4b5-42a9-44e5-9ed3-6a50c6fdcc52"
}

当没有数据存在时,我正在获取

<Empty JSON content>

收到回复后如何处理所有这些问题

【问题讨论】:

  • 收到错误时您会得到什么响应状态?我假设在这种情况下你不会得到200?如果是这样,您可以先检查响应中的 HTTP 状态代码
  • 在所有情况下,我都会收到 200 个状态码
  • 这是一个字符串“”还是{}?

标签: c# json.net deserialization


【解决方案1】:

您可以先检查空响应,然后在 try-catch 中尝试解析数组。如果它不是数组,它会抛出你可以捕获的异常,并解析 Json 对象:

string resp; //this is where you will store your response from server
JArray array;
JObject json;
if(resp == "<Empty JSON content>")
{
   Console.WriteLine("Response is empty json");
}
else
{
   try
  {
    array = JArray.Parse(resp);
    Console.WriteLine("Array parsed");
  }
  catch (Newtonsoft.Json.JsonException ex)
  {
      try
      {
         json = JObject.Parse(resp);
         Console.WriteLine("error parsed");
      }
      catch(Newtonsoft.Json.JsonException ex2)
      {
         Console.WriteLine("Response was not json object");
      }        
  }
}

【讨论】:

    【解决方案2】:

    因此,您希望根据收到的内容来处理这些不同类型的响应... 好吧,首先你可以转到json2csharp 并自动生成类,如果你还没有的话。

    然后你需要添加这些类,你会得到这样的东西:

    public class File
        {
            public class RootObject
            {
                public List<string> fileName { get; set; }
                public List<string> date { get; set; }
                public List<string> time { get; set; }
                public string id { get; set; }
                public int version_ { get; set; }
            }
        }
    

    在不同的班级:

    public class Error
        {
            public class ValidationError
            {
                public string errorCode { get; set; }
                public string path { get; set; }
                public string apiMessage { get; set; }
            }
    
            public class RootObject
            {
                public string resultType { get; set; }
                public string errorType { get; set; }
                public string errorCode { get; set; }
                public string apiMessage { get; set; }
                public List<ValidationError> validationErrors { get; set; }
                public string requestId { get; set; }
            }
        }
    

    所以,既然你已经有了将对象反序列化到的类,你需要将 json 命名空间添加到你需要接收 json 的位置(如果你找不到它,只需安装 nugget Newtonsoft.Json):

    using Newtonsoft.Json;
    

    因此,在您获得响应 JSON 对象后,您可以将其反序列化为您创建的对象列表:

    var file = JsonConvert.DeserializeObject>(response);

    由于我没有收到那些 json 对象,我无法完全复制它,但您基本上将其封装到 try catch 块中,如果它抛出任何错误,您就会知道您收到的对象不是那种类型( File),而不是 (Error) 类型,因此,在捕获错误后,您可以执行相同的操作。并且应该在 Error 对象上发生同样的事情,你会知道你没有得到任何东西。

    如果您有任何疑问,请联系我。

    【讨论】:

      【解决方案3】:

      如果成功和不成功的调用都得到 200,您可以尝试反序列化对 dynamic 的响应,然后检查元素。

      dynamic response = JsonConvert.DeserializeObject(json);
      

      在此处查看类似问题:Deserialize json in a "TryParse" way

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        • 2015-08-05
        • 2018-10-03
        相关资源
        最近更新 更多