windows7+eclipse+java+json+protobuffer

这两天测试了一下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类型的数据,解决嵌套的问题。

    如果这篇文章对您有帮助,麻烦伸个爪点个赞哈,嘻嘻!

猜你喜欢

转载自blog.csdn.net/u013482344/article/details/89641640