这两天测试了一下json嵌套数据的解析和protobuffer嵌套数据的表示,源码实现了读取json文件中的数据,并解析出数据内容用protobuffer对数据进行序列化表示,不多说了,上源码!
json数据内容:
{ "serviceList": [
{
"serviceName":"service1",
"serviceIp":"192.168.1.1",
"servicePort":5000,
"serviceState":"run",
"microService": [
{
"mserviceName":"mservice1",
"mserviceIp":"192.168.1.16",
"mservicePort":5001,
"mserviceState":"run"
},
{
"mserviceName":"mservice2",
"mserviceIp":"192.168.1.2",
"mservicePort":5002,
"mserviceState":"run"
},
{
"mserviceName":"mservice3",
"mserviceIp":"192.168.1.3",
"mservicePort":5003,
"mserviceState":"run"
},
{
"mserviceName":"mservice4",
"mserviceIp":"192.168.1.4",
"mservicePort":5004,
"mserviceState":"run"
},
{
"mserviceName":"mservice5",
"mserviceIp":"192.168.1.5",
"mservicePort":5005,
"mserviceState":"run"
}
]
},
{
"serviceName":"service2",
"serviceIp":"192.168.1.62",
"servicePort":5100,
"serviceState":"run",
"microService": [
{
"mserviceName":"mservice1",
"mserviceIp":"192.168.1.7",
"mservicePort":5101,
"mserviceState":"run"
},
{
"mserviceName":"mservice2",
"mserviceIp":"192.168.1.8",
"mservicePort":5102,
"mserviceState":"run"
},
{
"mserviceName":"mservice3",
"mserviceIp":"192.168.1.9",
"mservicePort":5103,
"mserviceState":"run"
},
{
"mserviceName":"mservice4",
"mserviceIp":"192.168.1.10",
"mservicePort":5104,
"mserviceState":"run"
}
]
}
]
}
定义的proto文件内容:
message microServiceCa{
required string mserviceName = 1;
required string mserviceIp = 2;
required string mservicePort = 3;
required string mserviceState = 3;
}
message serviceCa{
required string serviceName = 1;
required string serviceIp = 2;
required string servicePort = 3;
required string serviceState = 3;
repeated microServiceCa mSer = 4;
}
message serviceCaSet{
repeated serviceCa serCa = 1;
}
java源码:
使用的库:
package com.catalog;
import java.io.File;
import org.apache.commons.io.FileUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.catalog.CatalogMessage;
public class mainF {
public static void main(String[] args) throws Exception{
//sCS数据汇总,sC是sCS下面的子数据数组,mSC是sC下的子数据数组
CatalogMessage.serviceCaSet.Builder sCS = CatalogMessage.serviceCaSet.newBuilder();
CatalogMessage.serviceCa.Builder sC = CatalogMessage.serviceCa.newBuilder();
CatalogMessage.microServiceCa.Builder mSC = CatalogMessage.microServiceCa.newBuilder();
String outJson1;
JSONArray jsonArray = null;
JSONArray mjsonArray = null;
try {
System.out.println("come to");
outJson1 = FileUtils.readFileToString(new File("D:/mysoftware/eclipseworkspace/Server/resource/data.json"), "UTF-8");
JSONObject jsonObject = JSONObject.fromObject(outJson1);
System.out.println("jsonObject.size()="+jsonObject.size());
if (jsonObject != null) {
jsonArray = jsonObject.getJSONArray("serviceList");
System.out.println("JSONArray.size()="+jsonArray.size());
//mjsonArray = jsonArray.getJSONObject(0).getJSONArray("microService");
//System.out.println("mJSONArray.size()="+mjsonArray.size());
for(int i=0;i<jsonArray.size();i++) {
sC.setServiceName(jsonArray.getJSONObject(i).getString("serviceName"));
sC.setServiceIp(jsonArray.getJSONObject(i).getString("serviceIp"));
sC.setServicePort(jsonArray.getJSONObject(i).getInt("servicePort"));
sC.setServiceState(jsonArray.getJSONObject(i).getString("serviceState"));
mjsonArray = jsonArray.getJSONObject(i).getJSONArray("microService");
//System.out.println("mJSONArray.size()="+mjsonArray.size());
for(int j=0;j<mjsonArray.size();j++)
{
//System.out.println("sC="+sC.getAllFields());
mSC.setMserviceName(mjsonArray.getJSONObject(j).getString("mserviceName"));
mSC.setMserviceIp(mjsonArray.getJSONObject(j).getString("mserviceIp"));
mSC.setMservicePort(mjsonArray.getJSONObject(j).getInt("mservicePort"));
mSC.setMserviceState(mjsonArray.getJSONObject(j).getString("mserviceState"));
sC.addMSer(mSC);
}
sCS.addSerCa(sC);
mjsonArray.clear();
sC.clear();
}
}
System.out.println("protobuf:"+sCS.getAllFields());
byte[] sCSByte=sCS.build().toByteArray();
System.out.println("sCSByte.length="+sCSByte.length+"jsonsize="+outJson1.length());
} catch (Exception e) {
e.printStackTrace();
jsonArray = null;
}
}
}
总结一下,json解析主要通过JSONObject类来实现,数组通过JSONArray来获取,protobuffer对数组的表示主要通过repeated关键字来实现,尤其是repeated可以用来修饰message类型的数据,解决嵌套的问题。
如果这篇文章对您有帮助,麻烦伸个爪点个赞哈,嘻嘻!