天天看點

關于java中常見資料格式的問題

關于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 +
                '}';
    }