我正在使用一个API,它返回如下JSON响应;
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: length
{
"SAPISetPermitInfo_response" : {
"RC" : "value",
"MessageText" : "value"
}
}
我想创建一个可以与一起使用的c#类定义
JsonConvert.DeserializeObject<SAPISetPermitInfoResponse>(response);
但是,由于嵌套的元素,我不确定如何构造SAPISetPermitInfoResponse类,使其能够正确地与响应JSON字符串一起工作。
目前,我们使用一个helper方法从JSON字符串中剥离"SAPISetPermitInfo_response"元素,然后反序列化结果,如下所示。。。
IDictionary<string, JToken> foo = JObject.Parse(response);
string key = foo.Keys.FirstOrDefault(k => k.EndsWith("_response"));
response = JsonConvert.SerializeObject(foo[key]);
然而,似乎应该有一种方法来创建SAPISetPermitInfoResponse类,这样它就可以允许嵌套元素,而不需要helper方法来解析JSON字符串。但是,到目前为止,我还没有找到一个。
我看到一篇文章,他们建议创建两个类,一个类只具有类型的dictionary属性,其中对象是另一个具有RC和MessageText属性的类,但这似乎有点麻烦,每个不同的API方法响应都需要两个类。(这个API有大约90个不同的方法,它们都以类似的嵌套方式返回一个JSON响应,该响应以方法名开头,后跟"_response")。
我无法控制API的响应字符串,所以我必须使用所给的内容。我只是想确保我以正确和最有效的方式来做这件事。
提前感谢您的帮助。
试试这个:
public class Result
{
public SAPISetPermitInfo SAPISetPermitInfo_response { get; set; }
}
public class SAPISetPermitInfo
{
public string RC { get; set; }
public string MessageText { get; set; }
}
然后:
string json = ... the JSON shown in your question
var response = JsonConvert.DeserializeObject<Result>(json);
Console.WriteLine(response.SAPISetPermitInfo_response.RC);
Console.WriteLine(response.SAPISetPermitInfo_response.MessageText);
您需要做的是创建以下类:
public class SAPISetPermitInfoResponse
{
public string RC { get; set; }
public string MessageText { get; set; }
}
public class RootObject
{
public SAPISetPermitInfoResponse SAPISetPermitInfo_response { get; set; }
}
当你想要解析所需的Json时,你需要能够从API响应中只得到Json,而不需要Headers,比如说我们有
string responseJson = "{ "SAPISetPermitInfo_response" : {"RC" : "value","MessageText" : "value"}}";
我们可以将其发送到以下函数以从Json字符串中获取对象:
public RootObject GetObjectFromResponse(string responseJson)
{
return JsonConvert.DeserializeObject<RootObject>(responseJson);
}
此外,为了获得知识,您可以使用以下网站创建任何给定的Json到类对象:
http://json2csharp.com/