我正在调用一个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>
收到回复后如何处理所有这些问题
答案 0 :(得分: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");
}
}
}
答案 1 :(得分:1)
因此,您希望根据收到的内容来处理那些不同类型的响应... 好吧,首先,您可以转到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):< / p>
using Newtonsoft.Json;
因此,在获得响应JSON对象之后,您可以将其反序列化为您创建的对象列表:
var文件= JsonConvert.DeserializeObject>(响应);
由于我没有收到那些json对象,所以我不能完全复制它,但是您基本上将其封装到try catch块中,并且如果它抛出任何错误,您就会知道收到的对象不是thtat类型的(文件),而不是(错误)类型,因此,在捕获错误之后,您可以执行相同的操作。并且应该在Error对象上发生相同的事情,您会知道自己什么也没得到。
如果有任何疑问,请ping我。
答案 2 :(得分:0)
如果成功和不成功的呼叫都获得200,则可以尝试反序列化对dynamic
的响应,然后检查元素。
dynamic response = JsonConvert.DeserializeObject(json);
在这里看到类似的问题:Deserialize json in a "TryParse" way。