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

时间:2017-01-10 20:13:54

标签: c# json json.net deserialization

我正在使用返回JSON响应的API,如下所示;

JsonConvert.DeserializeObject<SAPISetPermitInfoResponse>(response); 

我想创建一个可以与

一起使用的c#类定义
IDictionary<string, JToken> foo = JObject.Parse(response);
string key = foo.Keys.FirstOrDefault(k => k.EndsWith("_response"));
response = JsonConvert.SerializeObject(foo[key]); 

但是我不确定如何构造SAPISetPermitInfoResponse类,以便它可以与响应JSON字符串一起正常工作,因为嵌套元素。

目前,我们正在使用辅助方法基本上剥离&#34; SAPISetPermitInfo_response&#34; element形成JSON字符串,然后反序列化结果,如...

Find

但是,似乎应该有一种方法来创建SAPISetPermitInfoResponse类,以便它允许嵌套元素,而不需要帮助方法来解析JSON字符串。但是,到目前为止,我找不到任何运气。

我看过一篇文章,他们建议创建两个类,一个只有类型的字典属性,其中对象是另一个具有RC和MessageText属性的类,但这看起来有点麻烦,应该需要两个类对于每种不同的API方法响应。 (此API有大约90种不同的方法,它们都返回一个JSON响应,该响应以方法名称开头,后跟&#34; _response&#34;以类似的嵌套方式)。

我无法控制API的响应字符串,因此我必须处理我所获得的内容。我只是想确保我以正确和最有效的方式做到这一点。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

试试这个:

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);

答案 1 :(得分:0)

您需要做的是创建以下类:

public class SAPISetPermitInfoResponse
{
    public string RC { get; set; }
    public string MessageText { get; set; }
}

public class RootObject
{
    public SAPISetPermitInfoResponse SAPISetPermitInfo_response { get; set; }
}

当你想要解析所需的Json时,你需要能够在没有Headers的情况下从API响应中获得Json,我们已经说过了

string responseJson = "{ \"SAPISetPermitInfo_response\" : {\"RC\" : \"value\",\"MessageText\" : \"value\"}}";

我们可以将它发送到以下函数以从Json字符串中获取对象:

    public RootObject GetObjectFromResponse(string responseJson)
    {
        return JsonConvert.DeserializeObject<RootObject>(responseJson);
    }

同样只是为了知识,您可以使用以下站点创建任何给定的Json到类对象:

http://json2csharp.com/