Http Post发送json序列请求(json序列化和反序列化)

项目中竟然遇到了这样的问题,要求客户端请求的方式为:参数按照json序列化,然后使用post方式传递给服务器。第一次看到这个东东有点一头雾水,刚开始开发的时候全部使用的get请求方式,因为当时公司不考虑数据安全问题。后来使用了post方式,使用到了session。这下倒好接触了序列化json,然后post方式提交。

首先需要引用谷歌的gson.jar文件,这里面有一些序列化参数的方法,我用到的比较简单直接使用了tojson(类名字);   定义最外层的类PostArgs:

public class PostArgs {

	public BaseRequest baseRequest;

	public String newsId;
}

里面嵌套BaseRequest类,

public class BaseRequest {  

    public String action;  

    public String version;  

    public UserInfo userInfo;
}

接着是第三层UserInfo类:

public class UserInfo {  

    public String userId;  

    public String userName;
}

在主程序里测试为:

PostArgs postArgs = new PostArgs();
        BaseRequest baseRequest = new BaseRequest();
        UserInfo userInfo = new UserInfo();
        userInfo.userId = "walker";
        baseRequest.action = "getAction";
        baseRequest.version = "1.1.1";
        postArgs.baseRequest = baseRequest;
        postArgs.newsId = "1000.1";
        baseRequest.userInfo = userInfo;
        Gson gson = new Gson();  

        System.out.println(gson.toJson(postArgs));

输出结果为:

{"baseRequest":{"action":"getAction","userInfo":{"userId":"walker"},"version":"1.1.1"},"newsId":"1000.1"}

这样就完成了json的序列化。接下来就是把序列化的数据以post的方式提交给服务器了。

/*
     * post请求,
     */
    public static String post(String httpUrl, String parMap,Context context)
    {
        System.out.println("post:"+httpUrl);
        InputStream input = null;//输入流
        InputStreamReader isr = null;
        BufferedReader buffer = null;
        StringBuffer sb = null;
        String line = null;
        AssetManager am = null;//资源文件的管理工具类
        try {
            /*post向服务器请求数据*/
            HttpPost request = new HttpPost(httpUrl);
            StringEntity se = new StringEntity(jsonArgs);
            request.setEntity(se);
            HttpResponse response = new DefaultHttpClient().execute(request);
            int code = response.getStatusLine().getStatusCode();
            System.out.println("postCode= " + code);
            // 若状态值为200,则ok
            if (code == HttpStatus.SC_OK) {
                //从服务器获得输入流
                input = response.getEntity().getContent();
                isr = new InputStreamReader(input);
                buffer = new BufferedReader(isr,10*1024);  

                sb = new StringBuffer();
                while ((line = buffer.readLine()) != null) {
                    sb.append(line);
                }
            }   

        } catch (Exception e) {
            //其他异常同样读取assets目录中的"local_stream.xml"文件
            System.out.println("HttpClient post 数据异常");
            e.printStackTrace();
            return null;
        } finally {
            try {
                if(buffer != null) {
                    buffer.close();
                    buffer = null;
                }
                if(isr != null) {
                    isr.close();
                    isr = null;
                }
                if(input != null) {
                    input.close();
                    input = null;
                }
            } catch (Exception e) {
                }
        }
        System.out.println("PostData:"+sb.toString());
        return sb.toString();
    }

关键语句就两行:

StringEntity se = new StringEntity(jsonArgs);
request.setEntity(se);

new一个StringEntity,然后把这个当做request的参数设置进去就OK了。

现在客户端基本上返回值基本上也是json格式的值了,post之后返回的字段就可以使用反序列化的方式了。参考http://blog.csdn.net/walker02/article/details/8105936

Android开发中相当便捷的JSON反序列化实现(含源代码) 连带有handler和进度条功能

      在开发的应用程序的过程中,我相信json是使用最多的轻量级的数据交换格式,这里我就不介绍有关json的概念了。主要说明一下有关json反序列化的问题,一般情况下我们解析json都是下边这种方式:

[java] view
plain
copy

  1. try {  
  2.     jObj = new JSONObject(resultString);  
  3. } catch (JSONException e) {  
  4.     // TODO Auto-generated catch block  
  5.     e.printStackTrace();  
  6. }  

resultString是json类型的字符串,当转化为JSONObject类之后,我们还需要一个一个的去解析数据,

[java] view
plain
copy

  1. int status =jObj.getInt("Status");  
  2. String msgString = jObj.getString("Msg");  

你是不是会感觉到这样很麻烦呢,特别是对于用的比较多的值得时候。谷歌也发现了这个问题,他们开发出了一个json反序列化包。我们可以将返回的键值格式转化为类的格式,这个时候当我们再次使用的时候,就是类名.属性名就可以获取该变量的值了。我在这里摘取几行关键的代码,

[java] view
plain
copy

  1. //httpget请求返回结果  
  2.     String str = Common.requestApi("此处填写URL地址 ");  
  3.     System.out.println("str" + str);  
  4.     //json反序列化函数  
  5.     MagazineCategoryResp magazineCatagoryList = gson.fromJson(str, MagazineCategoryResp.class);  
  6.     Message message = new Message();  
  7.     message.what = 1;  
  8.     //把类赋值给message  
  9.     message.obj = magazineCatagoryList;  
  10.     //发送handler信息  在handler里面进行接收  
  11.     handler.sendMessage(message);  

就这样就可以实现json反序列化了,这是在handler里面进行处理的,一般情况下我们都是通过网络获取json格式的数据的。反序列化之后我们就可以在handler里面接受该类,然后就可以非常方便的使用变量值了。因为URL是公司的,所以我注释掉了,返回值的类型在源代码里我把打印出来信息放到了注释里,这次得到的编码格式不是UTF-8的,大家凑合着看吧。

handler里面处理数据代码

[java] view
plain
copy

  1. Handler handler = new Handler(){  
  2.     @Override  
  3.     public void handleMessage(Message msg) {  
  4.         switch (msg.what) {  
  5.         case 1:  
  6.             //反序列化结果在handler里使用  
  7.             MagazineCategoryResp magazineCatagoryList = (MagazineCategoryResp) msg.obj;  
  8.             //这里打印查看结果  可以以类的方式获取json值  
  9.             System.out.println("Result=" + magazineCatagoryList.data.get(0).name);  
  10.             tvTest.setText(magazineCatagoryList.data.get(0).name);  
  11.             break;  
  12.         }  
  13.         super.handleMessage(msg);  
  14.     }  
  15. };  

结果只是测试用的,所以直接使用了get(0)

    这里也使用了handler机制,还有进度条的使用,如果有不懂得可以去论坛里找相关的教程和例子。CSDN上也有很多大牛的博客里也有提及。

代码下载

时间: 2024-10-14 13:19:26

Http Post发送json序列请求(json序列化和反序列化)的相关文章

jackson (json、xml的序列化与反序列化)

jackson用于java对象到json的序列化与反序列化.还支持xml格式. jackson用于实现json与java对象的序列与反序列化.web service要实现跨机器传送对象那么就需要有一种技术能把对象转换为特定格式的信息.为了实现跨平台(比如把java对象转化为c#或c++对象),又考虑到方便人们阅读,所以基于字符串规则的转换是最理想的.json就是这样一个轻量级的数据交换格式,而jackson是一个实现该功能的很好用的框架. 1.获得 <dependency> <group

ASP.NET 中JSON “.NET研究”的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中

Json.Net系列教程 3.Json.Net序列化和反序列化设置

原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一个DataTable对象,如下: DataTable dt = new DataTable(); DataColumn dcName = new DataColumn("Name"); DataColumn

ASP.NET中JSON的序列化和反序列化

导读:JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{

JS对象序列化为JSON对象

JS对象序列化为JSON对象,如下代码: /**    * JSON 解析类    * 方法:    * 将JSON字符串解码为页面可识别的object对象    * @param {String} json The JSON string    * @return {Object} The resulting object     * Object o = JSONUtil.decode(json);    *     * 将JS对象序列化为JSON字符串    * @param {Mixed

asp.net JSON序列化与反序列化使用

  对JSON数据进行序列化和反序列化 可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例. DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Seri

ajax请求json数据并用js解析

这应该是每个web开发的人员都应该掌握的基础技术,需要的朋友可以参考下   自从接触了jquery就喜欢上了前端开发,而且深深感受到了前端开发的强大与重要之处.同时也想为asp.net鸣不平,事实上asp.net并 没有臃肿,说它臃肿的人无非是那些不了解它的人,可能他们看见过一些asp.net低级程序员在不断往页面里拖控件,然后发现生成的页面中含有大量的垃圾 代码,而且几乎把所有的逻辑处理都写在了服务器端,觉得服务器压力太大了.事实上,刚入门asp.net的人会有拖控件的习惯,但是当你再深入你会

Json序列化和反序列化方法解析

 本篇文章主要是对Json序列化和反序列化方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助  代码如下:  /// <summary>         /// Json序列化,用于发送到客户端         /// </summary>         public static string ToJsJson(this object item)         {               DataContractJsonSerializer serializer

在MVC中使用Json.Net序列化和反序列化Json对象

在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序列化.但是这个系统自带的Json序列化对象方法没有Json.Net好用,于是打算有些时候用Json.Net替代默认的实现. 要实现有时候用Json.Net,有时候用默认实现,那么就要保证系统中两种实现并存.对于Server将对象序列化成Json传给Client很简单,我们只需要建立一个新的Actio