關于java中常見資料格式的問題(底層的資料結構方面的知識先不研究了…,這裡隻是記錄下偶然發現的問題)
一、定義
資料格式:是描述資料儲存在檔案或記錄中的規則。可以是字元形式的文本格式,或二進制資料形式的壓縮格式。字元形式的文本格式占用的存貯空間多但透明度高,二進制數形式的壓縮格式占用的存貯空間少但缺少透明度。
二、問題引出
今天想處理excel資料,用Java封裝的Jar包去解析,入庫時,發現引用的工具對Excel讀取時,傳回的是 List,并不能真正傳回我希望的List,
[
[1, 阿拉巴馬州, Alabama, AL, 蒙哥馬利, Montgomery, null],
[2, 阿拉斯加州, Alaska, AK, 朱諾, Juneau, null],
[3, 阿利桑那州, Arizona, AZ, 菲尼克斯, Phoenix, null],
[4, 阿肯色州, Arkansas, AR, 小石城, Little rock, null],
[5, 加利福尼亞州, California, CA, 薩克拉門托, Sacramento, null],
[6, 科羅拉多州, Colorado, CO, 丹佛, Denver, null],
[7, 康涅狄格州, Connecticut, CT, 哈特福德, Hartford, null],
[8, 特拉華州, Delaware, DE, 多佛, Dover, null],
[9, 佛羅裡達州, Florida, FL, 塔拉哈西, Tallahassee, null]
]
這個資料其實是List的,在處理的時候,先周遊第一層,在把第二層Object強轉成List,然後對對象進行Set指派操作,即可完成解析,傳回所希望傳回的List。
處理後傳回的資料格式為以下:
[
State(id=1, chName=阿拉巴馬州, enName=Alabama, code=AL, captial=蒙哥馬利, capitalen=Montgomery, remark=null),
State(id=2, chName=阿拉斯加州, enName=Alaska, code=AK, captial=朱諾, capitalen=Juneau, remark=null),
State(id=3, chName=阿利桑那州, enName=Arizona, code=AZ, captial=菲尼克斯, capitalen=Phoenix, remark=null),
State(id=4, chName=阿肯色州, enName=Arkansas, code=AR, captial=小石城, capitalen=Little rock, remark=null),
State(id=5, chName=加利福尼亞州, enName=California, code=CA, captial=薩克拉門托, capitalen=Sacramento, remark=null),
State(id=6, chName=科羅拉多州, enName=Colorado, code=CO, captial=丹佛, capitalen=Denver, remark=null),
State(id=7, chName=康涅狄格州, enName=Connecticut, code=CT, captial=哈特福德, capitalen=Hartford, remark=null),
State(id=8, chName=特拉華州, enName=Delaware, code=DE, captial=多佛, capitalen=Dover, remark=null),
State(id=9, chName=佛羅裡達州, enName=Florida, code=FL, captial=塔拉哈西, capitalen=Tallahassee, remark=null)
]
三、Java中資料傳輸幾種格式
3.1 JSON
基本格式
{
"BigIntSupported": 995815895020119788889,
"date": "20180322",
"message": "Success !",
"status": 200,
"city": "北京",
"count": 632,
"data": {
"shidu": "34%",
"pm25": 73,
"pm10": 91,
"quality": "良",
"wendu": "5",
"ganmao": "極少數敏感人群應減少戶外活動",
"yesterday": {
"date": "21日星期三",
"sunrise": "06:19",
"high": "高溫 11.0℃",
"low": "低溫 1.0℃",
"sunset": "18:26",
"aqi": 85,
"fx": "南風",
"fl": "<3級",
"type": "多雲",
"notice": "陰晴之間,謹防紫外線侵擾"
},
"forecast": [
{
"date": "22日星期四",
"sunrise": "06:17",
"high": "高溫 17.0℃",
"low": "低溫 1.0℃",
"sunset": "18:27",
"aqi": 98,
"fx": "西南風",
"fl": "<3級",
"type": "晴",
"notice": "願你擁有比陽光明媚的心情"
},
{
"date": "23日星期五",
"sunrise": "06:16",
"high": "高溫 18.0℃",
"low": "低溫 5.0℃",
"sunset": "18:28",
"aqi": 118,
"fx": "無持續風向",
"fl": "<3級",
"type": "多雲",
"notice": "陰晴之間,謹防紫外線侵擾"
},
{
"date": "24日星期六",
"sunrise": "06:14",
"high": "高溫 21.0℃",
"low": "低溫 7.0℃",
"sunset": "18:29",
"aqi": 52,
"fx": "西南風",
"fl": "<3級",
"type": "晴",
"notice": "願你擁有比陽光明媚的心情"
},
{
"date": "25日星期日",
"sunrise": "06:13",
"high": "高溫 22.0℃",
"low": "低溫 7.0℃",
"sunset": "18:30",
"aqi": 71,
"fx": "西南風",
"fl": "<3級",
"type": "晴",
"notice": "願你擁有比陽光明媚的心情"
},
{
"date": "26日星期一",
"sunrise": "06:11",
"high": "高溫 21.0℃",
"low": "低溫 8.0℃",
"sunset": "18:31",
"aqi": 97,
"fx": "西南風",
"fl": "<3級",
"type": "多雲",
"notice": "陰晴之間,謹防紫外線侵擾"
}
]
}
}
優點
a.資料格式比較簡潔,也便于閱讀和解析,
b.具有自我描述性,易于閱讀編寫,也易于機器解析與生成
c.使用 Javascript文法來描述資料對象,但是 JSON 仍然獨立于語言和平台。JSON 解析器和 JSON 庫支援許多不同的程式設計語言。 目前非常多的動态(PHP,JSP,.NET)程式設計語言都支援JSON
d.非常适用于伺服器與JavaScript互動
3.2 XML(eXtensible Markup Language)
基本格式:
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
是基于标簽庫的資料,優點:
a.讀取XML文檔
b.使用XML DOM循環周遊文檔
c.讀取值并存儲與變量
3.3 YAML(Yet Another Markup Language)
基本格式
#YAML格式
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
my:
servers:
- dev.bar.com
- foo.bar.com
springtoot架構中常見的
優點:
a.由于實作簡單,解析成本低,特别适合在腳本語言中使用
b.YAML比較适合做序列化。因為它是宿主語言資料類型直轉的。
c.YAML做配置檔案也不錯。比如Ruby on Rails的配置就選用的YAML。
四、java 中常見的資料格式問題
4.1 List
[
State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F),
State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F),
State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F),
State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F),
State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F)
]
轉成Json後
[
{"capitalen":"A","code":"C","enName":"D","remark":"F","id":1,"captial":"B","chName":"E"},
{"capitalen":"A","code":"C","enName":"D","remark":"F","id":1,"captial":"B","chName":"E"},
{"capitalen":"A","code":"C","enName":"D","remark":"F","id":1,"captial":"B","chName":"E"},
{"capitalen":"A","code":"C","enName":"D","remark":"F","id":1,"captial":"B","chName":"E"},
{"capitalen":"A","code":"C","enName":"D","remark":"F","id":1,"captial":"B","chName":"E"}
]
4.2 Map
{a=State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F),
b=State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F),
c=State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F)}
轉成Json後
{
"a": {
"capitalen": "A",
"code": "C",
"enName": "D",
"remark": "F",
"id": 1,
"captial": "B",
"chName": "E"
},
"b": {
"capitalen": "A",
"code": "C",
"enName": "D",
"remark": "F",
"id": 1,
"captial": "B",
"chName": "E"
},
"c": {
"capitalen": "A",
"code": "C",
"enName": "D",
"remark": "F",
"id": 1,
"captial": "B",
"chName": "E"
}
}
4.3 Pojo
State(id=1, chName=E, enName=D, code=C, captial=B, capitalen=A, remark=F)
對應的Json
{
"capitalen": "A",
"code": "C",
"enName": "D",
"remark": "F",
"id": 1,
"captial": "B",
"chName": "E"
}
4.4 Array
這裡其實是數組的底層的是引用資料類型,toString方法隻是顯示其在記憶體中的位置
轉成Json後
["s","a","f","g","h"]
public String toString() {
return "McnRecordVo(" +
"programId=" + programId +
", contentId=" + contentId +
')';
}
@Override
public String toString() {
return "McnRecordVo{" +
"programId=" + programId +
", contentId=" + contentId +
'}';
}