怎么把jsonObject.getJSONArray(infoTableName)转换成一个JSONObject
时间: 2024-02-06 14:04:30 浏览: 65
如果你想把一个JSONArray对象转换成JSONObject对象,需要满足以下条件:
1. JSONArray中只包含一个JSONObject对象。
2. JSONObject对象中的每个key都是唯一的。
如果满足以上条件,可以使用以下代码将JSONArray对象转换成JSONObject对象:
```java
JSONArray jsonArray = jsonObject.getJSONArray(infoTableName);
JSONObject newJsonObject = jsonArray.getJSONObject(0);
```
其中,infoTableName是JSONArray对象所对应的key值,jsonObject是包含该JSONArray的JSONObject对象。这段代码首先从jsonObject中获取到JSONArray对象,然后再从JSONArray对象中获取到唯一的JSONObject对象。最终得到的newJsonObject就是一个JSONObject对象。需要注意的是,如果JSONArray中包含多个JSONObject对象,或者JSONObject对象中有重复的key值,那么以上代码可能会出现异常。
相关问题
while (!isLastPage) { // 封装请求头 ResponseEntity<String> responseEntity = restTemplate.exchange(StrUtil.format(djUrl, qssj, zzsj, page, limit), HttpMethod.GET, formEntity, String.class); JSONObject response = JSONUtil.parseObj(responseEntity.getBody()); log.info("调用登记信息查询接口返回:{}",responseEntity.getBody()); if (!"200".equals(response.getStr("code"))) { log.info("调用登记信息查询接口返回不是成功:{}_{}", response.get("code"), response.get("msg")); break; } List<BdBdcDj> djList = new ArrayList<>(); List<BdMessage> messageList = new ArrayList<>(); // 解析数据 JSONArray data = response.getJSONArray("data"); data.toList(JSONObject.class).forEach(jsonObject -> { String bsm = jsonObject.getStr("bsm"); // 如果数据库已存在本条记录,则忽略 if (bdBdcDjDao.selectByPrimaryKey(bsm) == null) { // 使用 MapperUtils.map 枚举字段设置有问题,勿改 BdBdcDj bdBdcDj = BeanUtil.mapToBean(jsonObject, BdBdcDj.class, false, null); bdBdcDj.setId(bsm); bdBdcDj.setHouseId(jsonObject.getStr("hbsm")); bdBdcDj.setDivisionCode(jsonObject.getStr("qxdm")); // 如果是转移登记则待处理 if ("C".equals(jsonObject.getStr("djlx"))) { bdBdcDj.setResolveStatus(ResolveStatusEnum.WAITING); // 如果是转移登记则如bdMessage,并推送维资 BdMessage msg = getMessageByDj(bdBdcDj); messageList.add(msg); } else { bdBdcDj.setResolveStatus(ResolveStatusEnum.NO_NEED); } djList.add(bdBdcDj); } });
首先可以将代码分离成不同的方法,提高可读性和可维护性,比如解析数据的部分可以封装成一个方法:
```java
private List<BdBdcDj> parseData(JSONArray data) {
List<BdBdcDj> djList = new ArrayList<>();
data.toList(JSONObject.class).forEach(jsonObject -> {
String bsm = jsonObject.getStr("bsm");
// 如果数据库已存在本条记录,则忽略
if (bdBdcDjDao.selectByPrimaryKey(bsm) == null) {
// 使用 MapperUtils.map 枚举字段设置有问题,勿改
BdBdcDj bdBdcDj = BeanUtil.mapToBean(jsonObject, BdBdcDj.class, false, null);
bdBdcDj.setId(bsm);
bdBdcDj.setHouseId(jsonObject.getStr("hbsm"));
bdBdcDj.setDivisionCode(jsonObject.getStr("qxdm"));
// 如果是转移登记则待处理
if ("C".equals(jsonObject.getStr("djlx"))) {
bdBdcDj.setResolveStatus(ResolveStatusEnum.WAITING);
// 如果是转移登记则如bdMessage,并推送维资
BdMessage msg = getMessageByDj(bdBdcDj);
messageList.add(msg);
} else {
bdBdcDj.setResolveStatus(ResolveStatusEnum.NO_NEED);
}
djList.add(bdBdcDj);
}
});
return djList;
}
```
然后将`while`循环体中的代码进行重构,提高代码可读性,例如:
```java
do {
ResponseEntity<String> responseEntity = restTemplate.exchange(StrUtil.format(djUrl, qssj, zzsj, page, limit), HttpMethod.GET, formEntity, String.class);
JSONObject response = JSONUtil.parseObj(responseEntity.getBody());
log.info("调用登记信息查询接口返回:{}", responseEntity.getBody());
if (!"200".equals(response.getStr("code"))) {
log.info("调用登记信息查询接口返回不是成功:{}_{}", response.get("code"), response.get("msg"));
break;
}
JSONArray data = response.getJSONArray("data");
List<BdBdcDj> djList = parseData(data);
bdBdcDjDao.insertBatch(djList);
page++;
isLastPage = data.size() < limit;
} while (!isLastPage);
```
最后,可以将`BdMessage msg = getMessageByDj(bdBdcDj);`这段代码移到`parseData`方法中,通过返回一个`Map`来返回`djList`和`messageList`。这样可以进一步简化`while`循环体,提高代码可读性和可维护性。
Map<String, Map<String, Object>> orgMap = JSONObject.parseObject(builder.toString()) .getJSONArray("data").toJavaList(Map.class).stream() .map(map -> new AbstractMap.SimpleEntry<String, Map<String, Object>>((String) map.get("orgId"), map)) .collect( Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue) );我这个该怎么改呢?
这段代码的作用是将一个JSON格式的字符串解析成一个Map<String, Map<String, Object>>对象。如果你想要修改这段代码,可以根据你的需求进行修改。
如果你想要修改解析JSON的方式,可以修改 `JSONObject.parseObject(builder.toString())` 这部分代码。你可以指定自己的JSON解析器或者修改解析的参数。
如果你想要修改解析后的Map对象,可以修改 `.map(map -> new AbstractMap.SimpleEntry<String, Map<String, Object>>((String) map.get("orgId"), map))` 这部分代码。你可以根据自己的需求修改这个映射关系。
如果你想要修改生成Map的方式,可以修改 `.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))` 这部分代码。你可以根据自己的需求修改这个生成Map的方式,例如指定Map的实现类、指定Map的排序方式等等。
阅读全文