本文已参与「新人创作礼」活动,一起开启掘金创作之路。
接上文,第一次做需求,辗转几次终于实现 JSON 的接收以及类型转换后,请求参数变了。经过讨论过后,规范了请求的调用与返回,得,还得接着改
一开始看到改过之后得请求与应答时,有点懵,因为前面好不容易才算解决了一部分,现在又要全部重改。后来仔细研究了一番,好像差别也不是非常大,而且之前在做的过程中也对 JSON 数据有了更进一步的了解,所以后面慢慢改得时候发现也不是很困难。
改过之后,请求参数是一个服务名;应答的是 ServiceName、ModelName、Monitors之间的关系,返回的 JSON 数据格式为:
{
“ServiceName”: [
{
"ModelName": "model1",
"Monitors":["monitor1", "monitor2"]
},
{
"ModelName": "model2",
"Monitors":["monitor3"]
},
{
"ModelName": "model3",
"Monitors":["monitor4", "monitor5", "monitor6"]
},
....
]
}
如上面所示,说明一下,其中 “ServiceName” 并不是写死的,这是需要我 Java 去服务注册中心查有哪些 Service,其中 “ModelName”、“Monitors” 这两个是C++函数中定义的变量名,这是我问了几遍才搞明白的结论(原谅我是个采集)。
大致清楚了,首先我需要到注册中心查服务,然后根据查到的服务,判断我要使用哪个,在调用C++函数的时候将服务名传过去。
接收到应答的 JSON 数据后,有了之前的经验,其实也比较简单。
拆开来看:
- 首先整个 response 是一个 JSON 数组,
- 这个数组中有很多个对象,
- 每个对象里面有 “ModelName”、“Monitors” 两个变量,前者是一个字符串,后者是一个字符串 JSON 数组。
清晰一点了,在 Java 这边:
- 首先定义一个对象 voObject,里面包含两个变量 “ModelName”、“Monitors” ,前者是字符串,后者是一个字符串集合(List);
- 在得到 response 后,根据前面需要找的服务名,拿到对应的 JSON 数组;
- 遍历这个数组,拿到每一个 JSON 对象 jsonObject,通过 jsonObject 的 getString() 方法获取到 “ModelName”、“Monitors” 对应的内容,然后直接将这些内容通过 set 方法给 Java 这边的 voObject 对象中的 “ModelName”、“Monitors” 变量赋值(这里需要注意返回的 JSON 数据中 “Monitors” 是一个 JSON 数组,需要通过 jsonObject.getJSONArray("Monitors").toJavaList(List.class) 来将 JSON 数组转化为 Java 的集合 List);
- 最后可以将所有的 voObject 全部放到一个 voList 中,再结合当前的 Service 合成一个 Map 返回给前端(Service 是 key,voList 是 value),用于表示 Service -- Model -- Monitors 三者之间的包含关系。
大致就是这么一个流程,最终效果是可以的,不知道我有没有说清楚。现在后端总算是基本完成了,真正进入页面的设计,前端目前还不是很熟练,边学边做吧..........