解析具有不同内容的JSON响应

时间:2018-08-13 09:09:09

标签: c# rest api json.net

应要求A,我得到回应:

{  
   "session":{  
      "lifetime":"600",
      "sid":"qweasdzxc:"
   },
   "httpStatus":200,
   "response":{  
      "state":"password",
      "token":"foobar123",
      "next_state":"dispatch"
   }
}

并应要求B我收到另一个答复:

{  
   "session":{  
      "lifetime":"600",
      "sid":"qweasdzxc:"
   },
   "httpStatus":200,
   "response":{  
      "origin":"NORMAL",
      "activate_bpa":false,
      "state":"dispatch",
      "next_state":"STOP"
      "is_nordea":false,
      "login_type":"NORMAL"
   },
   "data":{
      "img_src":"example.com"
   }
}

响应之间几乎没有区别。我应该如何处理?

我的第一个想法是创建将容纳所有可能数据的类:

public class BaseResponse
{
    public Session session { get; set; }
    public int httpStatus { get; set; }
    public Response Response { get; set; }
}

public class Session
{
    public string lifetime { get; set; }
    public string state { get; set; }
}

public class Response
{
    public string state { get; set; }
    public string token { get; set; }
    public string next_state { get; set; }
    public bool activate_bpa {get; set;}
    public string origin {get; set;}
    public bool is_nordea { get; set;}
    public string login_type {get; set;}

    public Data Data {get; set;}
}

public class Data
{
    public string img_stc {get; set;}
}

现在,我可以从请求AB获取数据,并将其中两个解析为BaseResponse,如下所示:

var aParsed = JsonConverter.DeserializeObject<BaseResponse>(aContent);
var bParsed = JsonConverter.DeserializeObject<BaseResponse>(bContent);

问题在于,aParsed将包含originactivate_bpa(以及更多)属性,这些属性将永远不会设置。我希望对象具有可响应的属性。

我真的不能在同一名称空间中创建两个不同的Response类。那我该怎么办?

3 个答案:

答案 0 :(得分:0)

如果您使用一些自动反序列化机制,请使用泛型。

public class BaseResponse<T>
{
    public Session session { get; set; }
    public int httpStatus { get; set; }
    public Response Response { get; set; }

    public T Data {get; set;}
}

...

public class Data
{
    public string img_stc {get; set;}
}

然后使用指定的 data

反序列化
var response = JsonConverter.Deserialize<BaseResponse<Data>>(json);

您可以对 Response

执行相同的操作
public class BaseResponse<TD, TR>
{
    public Session session { get; set; }
    public int httpStatus { get; set; }
    public TR Response { get; set; }

    public TD Data {get; set;}
}

var response = JsonConverter.Deserialize<BaseResponse<Data, ResponseA>>(json);

答案 1 :(得分:0)

您可以通过以下方式将它们反序列化为动态对象

JObject obj = JObject.Parse(json);

https://www.newtonsoft.com/json/help/html/ParsingLINQtoJSON.htm

然后,您可以通过点(。)表示法在对象中引用属性,例如, obj.origin,obj.state ... ect。

但是您将在这里丢失编译时类型检查,并且没有响应的基本数据结构。

答案 2 :(得分:0)

使用动态作为数据类型进行响应

public class BaseResponse
{

    public Session session { get; set; }
            public int httpStatus { get; set; }
            public dynamic Response { get; set; }
}