读取json接口怎么处理不同的返回结构?

dqw3721 2014-10-20 10:58:05
调用一个json接口,成功和失败的返回内容结构不同,一般应该怎么处理?

成功的返回

{
"item_get_response": {
"item": {
"num_iid": 2100530868790,
"title": "沙箱测试玛莎家居 现代简约 CD架 RHM251-6045"
}
}
}

失败的返回

{
"error_response": {
"code": 29,
"msg": "Invalid app Key",
"sub_code": "isv.appkey-not-exists"
}
}

这两种结构应该定义两个对象吧,我现在想的是先匹配一个如果异常再匹配另一个。
...全文
410 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
CyberLogix 2014-10-20
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
[quote=引用 楼主 dqw3721 的回复:] 调用一个json接口,成功和失败的返回内容结构不同,一般应该怎么处理? 成功的返回

{
  "item_get_response": {
    "item": {
      "num_iid": 2100530868790,
      "title": "沙箱测试玛莎家居 现代简约 CD架 RHM251-6045"
    }
  }
}
失败的返回

{
  "error_response": {
    "code": 29,
    "msg": "Invalid app Key",
    "sub_code": "isv.appkey-not-exists"
  }
}
这两种结构应该定义两个对象吧,我现在想的是先匹配一个如果异常再匹配另一个。
实际上判断前25个字节就能判断是不是 Error 了。当然你也可以先做 json 解析,判断 token 更“像”哪一个,然后确定了类型之后再反序列化。 我想这是“接口方”设计得比较糙的结果。如果比较通用的设计,可能会返回
{
  "type" : ".....",
  "receive time“: ......,
  "response time":.......,
  "object":
  {
      "item_get_response": {
        "item": {
          "num_iid": 2100530868790,
          "title": "沙箱测试玛莎家居 现代简约 CD架 RHM251-6045"
        }
      }
  }
}
这样的json,也就是说在最外层是一些控制信息,包括告诉你返回的内容的具体类型。内层才是真正返回的数据。[/quote] 楼上说的太对了
sunny906 2014-10-20
  • 打赏
  • 举报
回复

                if (s.ToLower().Contains("error_response"))
                {
                    Json_error_response error = (Json_error_response)new DataContractJsonSerializer(typeof(Json_error_response)).ReadObject(ms);
                }
                else if (s.ToLower().Contains("item_get_response"))
                {
                    Json_item_get_response correct = (Json_item_get_response)new DataContractJsonSerializer(typeof(Json_item_get_response)).ReadObject(ms);
                }
  • 打赏
  • 举报
回复
引用 7 楼 Forty2 的回复:
倒是可以把item_get_response和error_response放在同一个类里,两个都标志为可选的(就是server不给也没关系)。 Response resp = ...; if (resp.error_response != null) { // 出错处理 } else { // 使用resp. item_get_response } [/code]
不要胡乱拼凑这种东西。你得程序需要真正去“扩展”的,不是纠结于眼前这两个属性。你不可能每一次都靠“破坏”这段代码重新编写(和编译)它而扩展。 .net只有僵化的 json 反序列化方法,根本没有必要的 json 解析功能,因此我们不用 .net 内置的方法。不得不使用 NewtonSoft.Json。建议你也在此处扔掉 .net framework 中的,选择第三方。
  • 打赏
  • 举报
回复
引用 楼主 dqw3721 的回复:
调用一个json接口,成功和失败的返回内容结构不同,一般应该怎么处理? 成功的返回

{
  "item_get_response": {
    "item": {
      "num_iid": 2100530868790,
      "title": "沙箱测试玛莎家居 现代简约 CD架 RHM251-6045"
    }
  }
}
失败的返回

{
  "error_response": {
    "code": 29,
    "msg": "Invalid app Key",
    "sub_code": "isv.appkey-not-exists"
  }
}
这两种结构应该定义两个对象吧,我现在想的是先匹配一个如果异常再匹配另一个。
实际上判断前25个字节就能判断是不是 Error 了。当然你也可以先做 json 解析,判断 token 更“像”哪一个,然后确定了类型之后再反序列化。 我想这是“接口方”设计得比较糙的结果。如果比较通用的设计,可能会返回
{
  "type" : ".....",
  "receive time“: ......,
  "response time":.......,
  "object":
  {
      "item_get_response": {
        "item": {
          "num_iid": 2100530868790,
          "title": "沙箱测试玛莎家居 现代简约 CD架 RHM251-6045"
        }
      }
  }
}
这样的json,也就是说在最外层是一些控制信息,包括告诉你返回的内容的具体类型。内层才是真正返回的数据。
Forty2 2014-10-20
  • 打赏
  • 举报
回复
倒是可以把item_get_response和error_response放在同一个类里,两个都标志为可选的(就是server不给也没关系)。 Response resp = ...; if (resp.error_response != null) { // 出错处理 } else { // 使用resp. item_get_response }

[DataContract]
public class Response
{
    [DataMember]
    public ItemGetResponse item_get_response;

    [DataMember]
    public ErrorResponse error_response;
}

[DataContract]
public class ItemGetResponse
{
    [DataMember]
    public Item item;
}

[DataContract]
public class Item
{
    [DataMember]
    public long num_iid;

    [DataMember]
    public string title;
}

[DataContract]
public class ErrorResponse
{
    [DataMember]
    public int code;

    [DataMember]
    public string msg;

    [DataMember]
    public string sub_code;
}
宝_爸 2014-10-20
  • 打赏
  • 举报
回复
引用 3 楼 dqw3721 的回复:
[quote=引用 1 楼 findcaiyzh 的回复:] 我的web api,如果错误返回的Http status code 不是200,而是错误的500, 403等,你看看你调用的api的文档。
status code都是200,没有做区分[/quote] 那就只能先按照正确的解析,不成功,再安装失败的解析;或者搜索字符串。
害羞的大叔 2014-10-20
  • 打赏
  • 举报
回复

if(json.item_get_response)
{
...
}
else if()
{
...
}
dqw3721 2014-10-20
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
直接处理json对象好了,或者让对方统一json格式
淘宝的api,肯定是改不了的 我想判断response里的字符串然后做区分,不知道有没有更好的处理方法。
dqw3721 2014-10-20
  • 打赏
  • 举报
回复
引用 1 楼 findcaiyzh 的回复:
我的web api,如果错误返回的Http status code 不是200,而是错误的500, 403等,你看看你调用的api的文档。
status code都是200,没有做区分
bdmh 2014-10-20
  • 打赏
  • 举报
回复
直接处理json对象好了,或者让对方统一json格式
宝_爸 2014-10-20
  • 打赏
  • 举报
回复
我的web api,如果错误返回的Http status code 不是200,而是错误的500, 403等,你看看你调用的api的文档。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧