如何构造一个类,使其可以用于反序列化具有嵌套元素的JSON字符串



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

相关内容

  • 没有找到相关文章

最新更新