android中java与服务器端servlet发送JSON数据请求

先看看JSONObject与JSONArray的区别

引用 https://www.cnblogs.com/xuanbo/p/6913585.html

JSON使用的一些注意事项

  • java代码使用JSON需要导入第三方包,7个jar包:
    json-lib-2.4-jdk15.jar, 除此之外,还需要导入
    commons-beanutils-1.7.0.jar
    commons-collections-3.1.jar
    commons-httpclient-3.1.jar
    commons-lang-2.3.jar
    commons-logging-1.0.4.jar
    ezmorph-1.0.3.jar
    然后import net.sf.json.JSONObject;就可以使用了
    jar包下载地址: http://pan.baidu.com/s/1miJxBao 密码:7y2m
  • 但是在Android Studio中导入这7个jar包会报错Error: Program type already present: org.apache.commons.collections 导入重复, 所以安卓中不用导入第三方包,使用安卓自带的包, org.json.JSONObject即可使用.
    详见引用的博客: https://www.jianshu.com/p/fd82d3903e0b
  • 由于两个使用的包不一样,安卓中使用JSON和服务器中使用JSON,用法不一样
服务器端:

student.java中必须要使用getXxx方法和setXXX方法,必须要重写toString,而且是规定的格式

public class Student {
    //姓名
    public String name;
    //年龄
    public String age;
    //住址
    public String address;

    //必须要使用getXxx方法和setXXX方法
    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    //必须要使用getXxx方法和setXXX方法
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public void setAddress(String address) {
        this.address = address;
    }

    //必须要是这种字符串的格式
    // idea编辑器可以右击->Generate->toString->点击完成即可自动生成
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

Servlet.java中部分代码:

Student stu = new Student();
stu.name="wang";
stu.age="15";
stu.address="安徽";

//java对象转为JSONObject
JSONObject j = JSONObject.fromObject(stu);
String str = j.toString();
System.out.println(str);

//JSONObject转为java对象
JSONObject j2 = JSONObject.fromObject(str);
Student s2 = (Student) JSONObject.toBean(j2,Student.class);
System.out.println(s2);

System.out.println(s2.name);
System.out.println(s2.address);

安卓中:

student.java中不一定需要使用getXxx方法和setXXX方法,不一定要重写toString()函数

  1. 安卓连接服务器发送JSON数据,可以使用HttpURLConnection 传输JSON数据
//网络地址,一定要带上http://
public static String url = "http://127.0.0.1:8080/WebPoject/servlet/TestServlet.do";
public static String url2 = "http://www.baidu.com";

public static void urlPostJSON(){
    try {
        //创建连接
        URL mUrl = new URL(url);
        HttpURLConnection mHttpURLConnection = (HttpURLConnection) mUrl.openConnection();
        mHttpURLConnection.setConnectTimeout(15000); //设置链接超时时间
        mHttpURLConnection.setReadTimeout(15000);  //设置读取超时时间
        mHttpURLConnection.setRequestMethod("POST"); //设置请求参数
        mHttpURLConnection.setRequestProperty("Connection", "Keep-Alive"); //添加Header
        mHttpURLConnection.setDoInput(true);//接收输入流
        mHttpURLConnection.setDoOutput(true); //传递参数时需要开启
        mHttpURLConnection.setUseCaches(false);//Post方式不能缓存,需手动设置为false
        mHttpURLConnection.connect();

        //Post请求,发送JSON数据
        DataOutputStream out = new DataOutputStream(mHttpURLConnection.getOutputStream());
        JSONObject jsonObject = new JSONObject();
        //参数少的时候
        //jsonObject.put("id","20190101");
        //jsonObject.put("name","wang王");
        //参数多的时候
        Student stu = new Student();
        stu.setXXX(); //.....
        jsonObject.put("student",stu);
        //字符编码
        String sendStr = URLEncoder.encode(jsonObject.toString(),"utf-8");
        out.writeBytes(sendStr);
        out.flush();
        out.close();

        System.out.println("=========发送的数据是:");
        System.out.println(sendStr);
        System.out.println("发送完成====================");

        //读取返回的响应
        BufferedReader br = new BufferedReader(new InputStreamReader(mHttpURLConnection.getInputStream()));
        String line;
        StringBuffer sb = new StringBuffer("");
        while((line=br.readLine())!=null){
        	//解码
            //line = URLDecoder.decode(line,"utf-8");
            sb.append(line);
        }
        System.out.println("收到的数据是:");
        System.out.println(sb);
        br.close();

        //断开连接
        mHttpURLConnection.disconnect();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 安卓连接服务器发送JSON数据,还可以使用 HttpClient, 但是Android 6.0(API 23) 中,Google已经弃用了Apache HttpClient 相关类

服务器端

TestServlet.java

package com.android.signIn;

import net.sf.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;

//servlet注解,表示项目的根目录的serlvet/TestServlet.do
@WebServlet(name = "TestServlet",
        urlPatterns = {"/servlet/TestServlet.do"})
public class TestServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //修改为utf-8编码
        response.setCharacterEncoding("utf-8");
        PrintWriter pw = response.getWriter();
        String acceptjson = "";
        try {
            //从流中读取数据
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (ServletInputStream) request.getInputStream(), "utf-8"));
            StringBuffer sb = new StringBuffer("");
            String temp;
            while ((temp = br.readLine()) != null) {
                sb.append(temp);
            }
            br.close();
            acceptjson = sb.toString();
            System.out.println("收到的字符是:"+acceptjson);
            acceptjson = URLDecoder.decode(sb.toString(),"utf-8");
            System.out.println("解码后的字符是:"+acceptjson);

            if (acceptjson != "") {
                //数据转为JSONA
                //对应上面的参数少的时候
                JSONObject jsonObject = JSONObject.fromObject(acceptjson);
                String id = jsonObject.getString("id");
                String name = jsonObject.getString("name");
                //参数多的时候
                
                System.out.println(id+":"+name+"=========================");

                //返回OK
                pw.write("OK====================");
            }
            else{
                //返回错误
                pw.write("ERROR");
            }

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("出现错误了***********");
        }
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //修改为utf-8编码
        response.setCharacterEncoding("utf-8");
        PrintWriter pw = response.getWriter();
        pw.println("请使用Post请求");
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值