`
jafisher
  • 浏览: 56746 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

httpclient请求方式下的泛型json转换问题

阅读更多
  我们在采用httpclient方式进行服务调用时,如果服务方以对象的方式封装入参和出参,我们就经常需要将我们的请求对象先转换成 json 格式,通过输入输出流的方式传输数据,返回的参数再从 json 格式转换为特定对象,如下:
Producer producer = new Producer();
...构造参数...
String jsonData = GsonUtils.toJson(producer);
...httpclient请求...
Consumer consumer = GsonUtils.fromJson(jsonResult, Consumer.class);


  采用这种方式,可以很容易得到想要的结果,但如果服务方返回的是泛型对象就麻烦了,如下:
GenericResult<Consumer> result = GsonUtils.fromJson(jsonResult,GenericResult.class);


  这样是可以得到返回的内容,甚至还能在前端取到 result 对象中的基本类型数据,但自定义对象数据就无法取到了。如果使用 Consumer consumer = result.getConsumer(); 就会报错,如下"java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to Consumer"之类的类型转换错误,因为泛型转换过程中如果直接使用父类类型从 json 格式转换过来,他是没办法再转换成相应的子类的。更具体的原因是由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。
 
  解决方法有两种,一种是直接使用resteasy的调用方式,那么根本就不存在这种问题;另一个就是借助 typeToken,只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。代码如下:
Producer producer = new Producer();
...构造参数...
String jsonData = GsonUtils.toJson(producer);
...httpclient请求...
Type type = new TypeToken<GenericResult<Consumer>>(){}.getType();
GenericResult<Consumer> result = (GenericResult<Consumer>)GsonUtils.fromJson(jsonResult, type);
Consumer consumer = result.getConsumer();


  这时 consumer 对象就能够正确识别了。
0
0
分享到:
评论

相关推荐

    HttpClient重新封装的HttpClient类

    8. **泛型支持**:通过泛型方法,可以直接将响应内容转换为目标类型,简化代码。 例如,一个简单的封装可能如下所示: ```csharp public class CustomHttpClient { private readonly HttpClient _httpClient; ...

    HttpClientHelper 工具类

    这样做的好处是避免了频繁创建和销毁HttpClient对象,降低了系统资源消耗,尤其在高并发场景下,可以防止大量并发请求对服务器造成压力。 HttpClientHelper 的主要功能可能包括以下部分: 1. **同步请求**:使用...

    Webservice传递泛型的案例,包括web服务端和mobile端

    在这个例子中,`gson.toJson()`将泛型对象转换为JSON字符串,`gson.fromJson()`则将服务器返回的JSON字符串反序列化回泛型类型`T`。 总结起来,这个案例涵盖了以下知识点: 1. 泛型的概念和C#中的泛型使用。 2. Web...

    fastjson-1.1.15.jar httpclient-4.1.3.jar httpcore-4.1.4.jar

    Fastjson支持多种复杂类型的数据转换,包括Java泛型、自定义类型、日期等,并且提供了流式API,适合处理大数据量的场景。此外,Fastjson还支持JSONPath,可以方便地对JSON对象进行查询和修改。 接下来是`httpclient...

    Android利用Json来进行网络数据传输

    本篇文章将探讨如何在Android环境下利用JSON进行网络数据传输。 首先,HTTP协议是互联网上应用最为广泛的一种网络传输协议,Android应用通常通过HTTP协议与服务器进行数据交互。在Android中,可以使用`...

    HttpPost Gson服务端与客户端的交互

    在客户端发送请求时,我们首先需要创建一个包含要发送数据的Java对象,然后使用Gson将其转换为JSON字符串。这个字符串可以作为HttpPost请求的实体内容。例如: ```java MyData data = new MyData(); // 设置data...

    gson-2.3.1.jar

    JSON作为一种轻量级的数据交换格式,它以易于人阅读和编写,同时也易于机器解析和生成的方式,描述了数据结构。在IT行业中,尤其是在Web服务开发中,JSON扮演着至关重要的角色,因为它能够高效地传输数据,同时兼容...

    Java灵活易用自封装http客户端

    返回值是一个泛型,可以自动将响应数据转换为指定的对象类型。为了支持多种数据格式,我们需要引入如Jackson或Gson这样的JSON库,并且可能还需要一个XML解析库,如JAXB或SimpleXML。 接下来,我们实现这个接口。...

    .Net整合Json实现REST服务客户端的方法详解

    然后,调用getResponseString方法将HttpWebResponse的响应体转换为字符串形式,最后使用***的JsonConvert.DeserializeObject方法将Json字符串反序列化为泛型对象T。 对于POST请求,方法名为doPostMethodToObj,它...

    C#写的新浪微博批量抓取器

    C#中,可以使用内置的System.Net.Http命名空间中的HttpClient类发送HTTP请求,同时利用Newtonsoft.Json库(Json.NET)进行JSON解析,将接收到的数据转换为C#对象,以便进一步处理和存储。 4. 数据抓取策略: 批量...

    eCPA独立接口.zip

    6. **序列化与反序列化**:为了在网络间传递数据,C#提供了Json.NET等库,将对象转换为JSON格式(序列化),然后在接收端再将JSON转换回对象(反序列化)。 7. **异常处理**:为了保证程序的健壮性,开发人员会使用...

    C#获得网易邮箱通讯录源码

    在C#中,可以使用HttpClient类来发送请求,接收响应,处理JSON或XML格式的数据。 6. **JSON解析**: API返回的数据通常为JSON格式,C#中的Newtonsoft.Json库(Json.NET)可以方便地进行JSON序列化和反序列化,将...

    .net版本WebApi和AccessWebApi两个项目(分别为宿主和调用方)_0520.rar

    6. **数据序列化和反序列化**:在API调用过程中,数据通常需要在JSON或XML格式间转换。C#提供了Json.NET库(Newtonsoft.Json)进行JSON序列化和反序列化,方便在客户端和服务端之间传递数据。 7. **错误处理和异常...

    安卓Android源码——客户端连接服务器并交互实例.zip

    8. **Retrofit库**:对于基于RESTful API的设计,Retrofit库可以简化接口调用,自动转换JSON数据,与Gson或其它序列化库无缝集成。 9. **事件总线**:当客户端与服务器交互完成后,可能需要更新UI或其他组件。使用...

    c#天气预报系统,代码很全面很不错

    在C#中,可以使用Json.NET这样的库来解析JSON数据,将接收到的原始数据转换为易于处理的对象。 系统的核心功能包括: 1. **数据获取**:通过发送HTTP请求到天气预报API,获取特定城市的天气信息。这涉及到URL构造...

    [安卓源码]PM25.zip项目安卓应用源码下载

    4. 泛型:提高代码类型安全性和重用性,减少类型转换的麻烦。 三、网络通信 1. HTTP请求:可能使用了HttpURLConnection或者Apache的HttpClient库来实现与服务器的数据交换。 2. JSON解析:Android内置的Gson或...

    100 Recipes for Programming Jav - Jamie Munro

    - **解释**: 解释了未经检查的类型转换可能导致的类型安全问题,并提供了使用泛型来提高代码类型安全性的方法。 ##### 食谱24: 在Java中分割字符串 - **知识点**: 字符串操作、正则表达式。 - **解释**: 介绍了如何...

    C#遥感影像下载系统源码.zip

    C#的System.Net命名空间提供了大量的类和方法用于处理网络请求,如HttpClient类用于发送HTTP请求,获取遥感影像数据。开发者需要熟悉HTTP协议,理解GET和POST请求的区别,以及如何处理响应数据,如JSON或XML格式的元...

    Java开发常用技术

    - HTTP客户端:OkHttp是一个高效的HTTP客户端库,可以用来发送HTTP请求,而Java内置的HttpURLConnection和Apache的HttpClient也是常见的选择。 11. **Spring框架**:Spring是Java开发的核心组件,提供了依赖注入、...

    C#网络应用编程 精典

    C#中的HttpClient类提供了一种简单而强大的方式来发送HTTP请求和接收响应,这对于构建Web API客户端或进行网页爬虫非常有用。 四、WebSocket协议 WebSocket是一种在单个TCP连接上进行全双工通信的协议,它极大地...

Global site tag (gtag.js) - Google Analytics