先看看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()函数
- 安卓连接服务器发送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();
}
}
- 安卓连接服务器发送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请求");
}
}