本文主要是介绍Jason解析基础、 相关类库以及FastJSON、Gson和Jackson,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.json格式化验证
http://www.json.cn/
Json键值对里面的键一定要是字符串
2 Json转Bean 工具
http://www.atool.org/json2javabean.php
3 Json解析 看根目录是[] 还是{} []使用JsonArray 否则使用JsonObject
4JsonReader 专门用于对流的直接解析 而一般的JsonArray,JsonObject是对字符串做的解析.
对于Object类型 选择reader.beginObject();
//解析体
reader.endObject();
//解析体具体写法
while (reader.hasNext()) {name = reader.nextName();if (name.equals("artwork_url")) {String artworkUrl = reader.nextString();//图片 mTrackObject.setArtworkUrl(artworkUrl);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: artworkwurl?" + artworkUrl);} else if (name.equals("duration")) {Long duration = reader.nextLong(); //时长 mTrackObject.setDuration(duration);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: duration?" + duration);} else if (name.equals("user")) {reader.skipValue();} else {reader.skipValue();} }
对于Array类型 选择reader.beginArray();
//解析体
reader.endArray();
//解析体具体写法
while(reader.hasNext()){} : 如果解析体有数据reader.nextName();
Returns the next token 返回下一个解析键 并往下解析
reader.nextString(); //nextLong ,nextBoolean etc. 返回下一个对应的解析值 并往下解析reader.skipValue(); 跳过该值,并往下解析//这行代码一定要行不然reader类不会对不匹配的键值对自动跳过 从而解析失败else { reader.skipValue();}
if (name.equals("collection")) {reader.beginArray();while (reader.hasNext()) {reader.beginObject();TrackObject mTrackObject = new TrackObject();mTrackObject.setGenre(genre);while (reader.hasNext()) {name = reader.nextName();if (name.equals("track")) {reader.beginObject();while (reader.hasNext()) {name = reader.nextName();if (name.equals("artwork_url")) {String artworkUrl = reader.nextString();//图片 mTrackObject.setArtworkUrl(artworkUrl);} else if (name.equals("user")) {reader.skipValue();} else {reader.skipValue();}}reader.endObject(); //歌手暂时不加 } else if (name.equals("score")) {int score = reader.nextInt();} else {reader.skipValue();}}mTrackObject.setUsername("anymous"); listTrackObjects.add(mTrackObject); reader.endObject();}reader.endArray();
try {JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));String genre = null;String kind = null;reader.beginObject();while (reader.hasNext()) {String name = reader.nextName();if (name.equals("genre")) {genre = reader.nextString();Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: genre??" + genre);} else if (name.equals("kind")) {kind = reader.nextString();Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: kind??" + kind);} else if (name.equals("collection")) {reader.beginArray();while (reader.hasNext()) {reader.beginObject();TrackObject mTrackObject = new TrackObject();mTrackObject.setGenre(genre);while (reader.hasNext()) {name = reader.nextName();if (name.equals("track")) {reader.beginObject();while (reader.hasNext()) {name = reader.nextName();if (name.equals("artwork_url")) {String artworkUrl = reader.nextString();//图片 mTrackObject.setArtworkUrl(artworkUrl);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: artworkwurl?" + artworkUrl);} else if (name.equals("duration")) {Long duration = reader.nextLong(); //时长 mTrackObject.setDuration(duration);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: duration?" + duration);} else if (name.equals("id")) {mTrackObject.setId(reader.nextLong());} else if (name.equals("permalink_url")) {String permalinUrl = reader.nextString();//链接 mTrackObject.setPermalinkUrl(permalinUrl);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: permalink?" + permalinUrl);} else if (name.equals("title")) {String title = reader.nextString(); //歌名 mTrackObject.setTitle(title);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: title?" + title);}/* else if (name.equals("uri")) { String uri = reader.nextString(); //歌名 mTrackObject.setPermalinkUrl(uri); Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: uri?" + uri); } */ else if (name.equals("waveform_url")) {String waveform_url = reader.nextString(); //波形 mTrackObject.setWaveForm(waveform_url);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: waveform_url?" + waveform_url);} else if (name.equals("user")) {reader.skipValue();} else {reader.skipValue();}}reader.endObject(); //歌手暂时不加 } else if (name.equals("score")) {int score = reader.nextInt();Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: score??" + score);} else {reader.skipValue();}}mTrackObject.setUsername("anymous");mTrackObject.setPlaybackCount(999);mTrackObject.setGenre(genre);mTrackObject.setStreamable(true);mTrackObject.setDownloadable(true);listTrackObjects.add(mTrackObject);Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: list size?" + listTrackObjects.size());reader.endObject();}reader.endArray();} else if (name.equals("last_updated")) {String last_updated = reader.nextString();}}reader.endObject();reader.close();Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: listkk size??" + listTrackObjects.size());} catch (Exception e) {e.printStackTrace();Log.d(TAG, "parsingListTrackObjectBySoundCloudGenre: 程序出错");} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}
对应 Json文件 :
{
"genre":"soundcloud:genres:all-music",
"kind":"top",
"last_updated":"2017-04-04T08:07:33Z",
"collection":[
{
"track":{
"artwork_url":"https://i1.sndcdn.com/artworks-000209741436-qfq484-large.jpg",
"commentable":true,
"comment_count":5712,
"created_at":"2017-02-26T22:16:38Z",
"description":"LUV IS RAGE 2 COMING SOON",
"downloadable":false,
"download_count":0,
"download_url":null,
"duration":179948,
"full_duration":179948,
"embeddable_by":"all",
"genre":"Alternative Rock",
"has_downloads_left":true,
"id":309689093,
"kind":"track",
"label_name":null,
"last_modified":"2017-04-05T01:26:31Z",
"license":"all-rights-reserved",
"likes_count":704051,
"permalink":"15-xo-tour-llif3",
"permalink_url":"https://soundcloud.com/liluzivert/15-xo-tour-llif3",
"playback_count":40332491,
"public":true,
"publisher_metadata":Object{...},
"purchase_title":null,
"purchase_url":null,
"release_date":null,
"reposts_count":79354,
"secret_token":null,
"sharing":"public",
"state":"finished",
"streamable":true,
"tag_list":"",
"title":"1.5- XO TOUR Llif3 (Produced By TM88)",
"uri":"https://api.soundcloud.com/tracks/309689093",
"urn":"soundcloud:tracks:309689093",
"user_id":10494998,
"visuals":null,
"waveform_url":"https://wis.sndcdn.com/yUlUifyRZcZV_m.json",
"display_date":"2017-02-26T22:16:38Z",
"monetization_model":"NOT_APPLICABLE",
"policy":"ALLOW",
"user":{
"avatar_url":"http://a1.sndcdn.com/images/default_avatar_large.png?1491306653",
"first_name":"",
"full_name":"",
"id":10494998,
"kind":"user",
"last_modified":"2017-04-04T03:20:26Z",
"last_name":"",
"permalink":"liluzivert",
"permalink_url":"https://soundcloud.com/liluzivert",
"uri":"https://api.soundcloud.com/users/10494998",
"urn":"soundcloud:users:10494998",
"username":"LIL UZI VERT",
"verified":false,
"city":"PHILADELPHIA",
"country_code":"US"
}
},
"score":6300458
},
{
"track":Object{...},
"score":4428696
},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...},
Object{...}
],
"query_urn":"soundcloud:charts:20e90a449de84c368d76fdc6a167ca02",
"next_href":"https://api-v2.soundcloud.com/charts?genre=soundcloud%3Agenres%3Aall-music&query_urn=soundcloud%3Acharts%3A20e90a449de84c368d76fdc6a167ca02&offset=20&kind=top&limit=20"
}
5Json解析最全基础:
JSON简介
- JAVAScript Object Notation是一种轻量级的数据交换格式
- 具有良好的可读和便于快速编写的特性。
- 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
- JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
- JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强
JSON支持的数据类型
我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现原理
JSON里面的数据是以一种键值对的方式存在
(”key”:”value”)中值的类型可以是下面数据类型中的任意一种:
1. 数字(整数或浮点数)
2. 逻辑值(true 或 false)
3. 字符串(在双引号中)
4. 数组(在方括号中)
5. 函数
6. 对象(在大括号中)
7. null
JSON语法规则
JSON的语法规则非常的简单,就是使用
大括号’{}’, 对象标记
中括号’[]’, 数组标记
逗号’,’, 数据标记
冒号’:’, 键值对标记
双引号’“”’ 字符串标记
数据类型:
嵌套对象、数组、字符串、数字、布尔值或空值。
我们在JSON解析中只有三中情况出现
1.{} 解析’大括号’类型
2. [ ] 解析是’中括号’类型
3. 其实只有两种,那第三种则是1与2的组合方法即”{’name’:’李书豪’ ,’hobby’:[‘编程’,’电竞’,’睡觉’]}”那么下面分别来看一些这三种类型以及解析
JSON基本语法与图例
- Object(对象类型)
- 用{ }包含一系列无序的key–Value键值对表示,其中Key和Value之间用冒号分割,每个key-value之间用逗号分割。
- 比如:
- Array(数组类型)
- 使用[ ]包含所有元素,每个元素用逗号分隔,元素可以是任意的值
- 比如:
- 组合形
JSON数据解析
-
JSON解析一定要掌握的两条规则:
- 1.如果看到是{ }–>使用JSONObject
- 2.如果看到的[ ]–>使用JSONArray解析
-
掌握了JSON的数据类型和基本语法后,下面我们将对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)
纯对象(Object)的解析{ }:
纯数组(Array)的解析{ }:
组合类型的解析(一):
- 例子: String json=”{‘name’:’李书豪’,’girlFriend’:{‘name’:’高圆圆’,’age’:18}}”;
- 分析: 我们首先是解析外面的大括号的对象,然后,通过girlfFriend,获取到对应的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值
开始解析:
小结: {[ {},{} ]}–>思路:第一步看到大括号:JSONObject去解,创建好对应里面的属性的值;第二步看到中括号:JSONArray去解析 对应创建好对应里面的属性值;第三步中括号里面的{},又是一个JSONObject。思路大致如此,强调注意的是,设置的属性值setXxx getXxx必须要和去获得值名称一致,不然会出错!!
组合类型的解析(二):
下面我们来解析一个略为复杂的JSON数据要解析的数据如下:
因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工具http://json.phpddt.com/ 这是JSON在线高亮解析 ,可以很好的帮助咱们进行解析分析。下面是我用网页解析好的图片,可以思考下步骤(记住两条规则)
分析:
一:第一个大括号(JSONObject){”desc”: “status”: “data”}
二:大括号里面有一个大括号(JSONObject){”wendu”: “20”, “ganmao”: “forecast”: “yesterday”: “aqi”: “city”: }
三:第二个大括号里面有两个对象 1.数组形(JSONArray) 2.对象形( JSONObject )
而数组形里面又套有数组的对象{} 。这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!
开始封装字段:
开始解析:
解析结果:
结语: 对于JSON解析个人的粗浅看法,
1.首先是对JSON数据的一个分析
2.其次是掌握JSON一些技巧(两条规则–对象形JSONObject ,数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路
(以上只是一个JSON初步的解析,但JSON解析的大致思路如此,后面有http套用的,无非也就把下载的文件转为JSON对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)
6 jackson, gson ,fastjson 对比
Java对象转换Json的细节处理
前言
一、fastJson
1、fastJson在转换java对象为json的时候,默认是不序列化null值对应的key的
输出结果:{"keywords":"123","sortingField":"234242"} , 没有序列化那些值为null的属性
2、但是如果想把null对应的key序列化出来呢?
Fastjson的SerializerFeature序列化属性:
输出结果如下:
3、想字符类型字段如果为null,转换输出为”“,而非null ,需要多加一个参数:WriteNullStringAsEmpty, 案例如下:
输出结果如下:
二、Jackson
1、jackson默认是序列化null对应的key的,也就是说不管你对象属性有没有值,在转换json的时候都会被序列化出来
2、同理,想要不序列化null也是可以的,具体如下:
注意:只对VO起作用,Map List不起作用,另外jackson还能过滤掉你设置的属性,具体的就各位自己去研究源码了
三、Gson
1、gson和fastjson一样,默认是不序列化null值对应的key的,具体案例如下:
3、若是想转行null为空字符串"",则需要手动处理了
这篇关于Jason解析基础、 相关类库以及FastJSON、Gson和Jackson的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!