前言:从这篇文章开始,正式进入本人的网络和数据通信方面的修炼和学习,期间会持续有数据通信相关的学习文章发布。
一、JSON学习网站介绍
二、org.json基本用法
注意:
- json是Android SDK官方的库。
- Java中要用到org.json【也就是用到常见的JSONObject或JSONArray类等】,前提是导入 org.json jar包。目前常用的如:
org.codeartisans:org.json
,也自行上网下载或Maven仓库查找导入。
1. 普通JSONObject对象的构建
public static JSONObject createJson(){
JSONObject object = new JSONObject();
object.put("name", "王小明");
object.put("age", 18.2);
object.put("birthday", "1990-01-01");
object.put("school", "蓝翔");
object.put("major", new String[]{"搬砖","挖掘机"};
object.put("car",nullObj);
object.put("comment", "这是注释");
return object;
}
2. 通过Map,构建json
public static JSONObject createJsonByMap(){
Map<String,Object> map = new HashMap<String, Object>();
Object nullObj = null;
map.put("name", "王小明");
map.put("age", 18.2);
map.put("birthday", "1990-01-01");
map.put("school", "蓝翔");
map.put("major", new String[]{"搬砖","挖掘机"};
map.put("car",nullObj);
map.put("comment", "这是注释");
return new JSONObject(map);
}
3. 通过Bean对象创建JsonObject对象
// 新建一个Bean对象,并提供getter和setting方法,注意:1.bean对象的成员,是:String、基本数据类型、Object类型
public static JSONObject createJsonByBean(){
Person xiaoming = new Person();
xiaoming.setName("王小明");
//......
xiaoming.setCar(null);
//.......
return new JSONObject(xiaoming);
}
4. 读取.json文件中的内容,并解析成JSONObject对象
//用到:org.apache.commons.io.FileUtils 文件
public static void main(String[] args) throws IOException {
File file = new File(JsonTest.class.getResource("/basic/json/test.json").getFile());
String content = readFileToString(file);
System.out.println(content);
JSONObject jsonObject = new JSONObject(content);
if (!jsonObject.isNull("name")) {
System.out.println(jsonObject.getString("name"));
}
JSONArray array = jsonObject.getJSONArray("major");
for(int i=0;i<array.length();i++){
System.out.println("major: "+ array.get(i));
}
}
三、GSON
包:com.google.gson
1.用法:
- 【序列化】解析Bean对象,变成json串
Gson gson = new Gson();
String jsonStr = gson.toJson(bean对象);
<u>复杂对象的情况可以参考以下的反序列化中的复杂类的例子,注意静态内部类的写法。</u>
- 【反序列化】json串变成POJO对象
- 解析简单类型对象
Gson gson = new Gson();
int i = gson.fromJson("100", int.class);
double d = gson.toJson("\"9.9\"", double.class);
String s = gson.toJson("ABC", String.class);
Bean bean = gson.toJson(json字符串 , Bean.class);//最终转成Object对象
/// ..............................
///其中Bean的成员是简单类型
public class Bean{
private int id;
private int age;
private String name;
/// getter、setter等
}
- 方式二:解析复杂对象
如果我的Bean对象中的成员带有List<>类型或Object子类等:
public class Bean{
private int id;
private int age;
private Address address;
private List<Friend> friends;
////自动反序列化的话,必须写成静态内部类的形式!!
public static class Address{
public String street;
public String city;
public String province;
}
public static class Friend{
public String name;
public String phoneNumber;
}
/// getter、setter等
}
然后,解析方法为:
Gson gson = new Gson();
Bean bean = gson.fromJson(json串, Bean.class);
//或者
Type type = new TypeToken<Bean>(){}.getType();
Bean bean = gson.fromJson(json串,type);
当Bean对象中存在 List<String>类型或者Set<String>类型,而不是String[]时,GSON同样可以将json串中的数组或集合解析出来,并以GSON默认的集合类型来构建,如下:
* List<String> -> ArrayList<String>
* Set<String> -> LinkedHashSet<String>
- Builder监听解析过程
//.....
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){
public String translateName(Field f){
if(f.getName().equals("name")){//改名(注意这里,与注释:@SerialzedName("name")是有冲突的,这个时候,注释优先级更大)
return "NAME";
}
return f.getName();
}
});
//.....
2. 强大之处:
-
@SerializedName("NAME")
可以将Bean类的成员name,更名为NAME,并转为json,如:
public class Bean{
@SerializedName("NAME")
private String name;
//......
}
在转换时,将得到:
{"NAME": "小明", ……}
而不是
{"name": "小明", ……}
- Object转json串过程中,忽略某个属性:
- 方式一:Bean类中,可以声明一个成员属性,如:
private transient String ignore;
这样一来,这个成员属性,就不会被解析成json串当中。 - 方式二:如果这个成员属性是String或者默认为null的类型,那么, 只要不初始化此属性,默认解析过程中,不会被解析到json串中。
- 支持Data日期类型
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
- GsonBuilder
通过GsonBuilder配置Gson对象,去达到更多效果的解析:
Gson gson = new GsonBuilder()
//序列化null
.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
.disableInnerClassSerialization()
//生成不可执行的Json(多了<u> ')]}' </u>这4个字符)
.generateNonExecutableJson()
//禁止转义html标签
.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
.create();
网友评论