JSON数据通信--org.json和Gson基本用法

前言:从这篇文章开始,正式进入本人的网络和数据通信方面的修炼和学习,期间会持续有数据通信相关的学习文章发布。

一、JSON学习网站介绍

二、org.json基本用法

注意:

  1. json是Android SDK官方的库。
  2. 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.用法:

  1. 【序列化】解析Bean对象,变成json串
Gson gson = new Gson();
String jsonStr = gson.toJson(bean对象);

<u>复杂对象的情况可以参考以下的反序列化中的复杂类的例子,注意静态内部类的写法。</u>

  1. 【反序列化】json串变成POJO对象
  2. 解析简单类型对象
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等
}
  1. 方式二:解析复杂对象
    如果我的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>

  1. Builder监听解析过程
//.....
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){

    public String translateName(Field f){
        if(f.getName().equals("name")){//改名(注意这里,与注释:@SerialzedName("name")是有冲突的,这个时候,注释优先级更大)
            return "NAME";
        }
        return f.getName();
    }
});
//.....

2. 强大之处:

  1. @SerializedName("NAME")可以将Bean类的成员name,更名为NAME,并转为json,如:
public class Bean{
  @SerializedName("NAME")
  private String name;
  //......
}

在转换时,将得到:

{"NAME": "小明", ……}

而不是

{"name": "小明", ……}
  1. Object转json串过程中,忽略某个属性:
  • 方式一:Bean类中,可以声明一个成员属性,如:private transient String ignore; 这样一来,这个成员属性,就不会被解析成json串当中。
  • 方式二:如果这个成员属性是String或者默认为null的类型,那么, 只要不初始化此属性,默认解析过程中,不会被解析到json串中。
  1. 支持Data日期类型
    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
  2. GsonBuilder
    通过GsonBuilder配置Gson对象,去达到更多效果的解析:
Gson gson = new GsonBuilder() 
//序列化null 
.serializeNulls() 
// 设置日期时间格式,另有2个重载方法 
// 在序列化和反序化时均生效
 .setDateFormat("yyyy-MM-dd")
 // 禁此序列化内部类 
.disableInnerClassSerialization()
 //生成不可执行的Json(多了<u> ')]}' </u>这4个字符) 
.generateNonExecutableJson() 
//禁止转义html标签 
.disableHtmlEscaping() 
//格式化输出 
.setPrettyPrinting() 
.create();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容