繁体   English   中英

C#:反序列化json对象

[英]c# : Deserialize json Object

我正在调用一个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>

得到回应后如何处理所有这些

您可以先检查是否为空,然后在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");
      }        
  }
}

因此,您想根据收到的内容来处理那些不同类型的响应...好吧,首先,您可以转到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名称空间(如果找不到它,只需安装块金Newtonsoft.Json):

using Newtonsoft.Json;

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

var file = JsonConvert.DeserializeObject>(response);

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

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

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

dynamic response = JsonConvert.DeserializeObject(json);

在这里看到类似的问题: 以“ TryParse”方式反序列化json

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM