{\"dimName\":\"模型分值\",\"echatsName\":\"私家车燃油车\",\"map\":{\"x\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\"],\"y\":[{\"name\":\"2024 - 求和项:CUR_REAL_ANP_ADJ\",\"ratio\":[0.215,0.127,0.1083,0.0989,0.0899,0.0819,0.0763,0.0715,0.0665,0.0607],\"type\":\"1\"},{\"name\":\"2024 - 求和项:PLR\",\"ratio\":[0.4833,0.5622,0.6001,0.6325,0.6656,0.7,0.7401,0.7892,0.8639,1.0385],\"type\":\"3\"},{\"name\":\"2024 - 求和项:LR\",\"ratio\":[0.4237,0.4333,0.6267,0.5871,0.5951,0.6223,0.837,0.8298,0.6898,0.8478],\"type\":\"2\"}],\"issueMonth\":[\"2024 - 求和项:CUR_REAL_ANP_ADJ\",\"2024 - 求和项:PLR\",\"2024 - 求和项:LR\"]},\"preFix\":\"分\",\"title\":\"提升效果\",\"type\":\"2\"} 如何把这个数据中的map变为 { “2024”:[{“1”:[{“PLR”:[…]},{“LR”:[…]}],…}], “2025”:[{“1”:[{“PLR”:[…]},{“LR”:[…]}],…}] }
时间: 2025-07-04 12:13:44 浏览: 9
这个问题的关键是**数据结构的重构与分组逻辑**,我们需要从原始 JSON 数据中的 `map.y` 字段提取出三种类型的数据(分别是 `PLR` 和 `LR`),并按年份进行归类,然后组织成嵌套结构。
---
### ✅ 原始数据说明
- `x`: 表示横轴数据,如 `"1"`, `"2"` 到 `"10"`。
- `y`: 是一个数组,每个元素包含:
- `name`: 如 `"2024 - 求和项:PLR"`
- `ratio`: 对应的数值数组
- `type`: 表示类型(1=CUR_REAL_ANP_ADJ, 2=LR, 3=PLR)
我们要提取的是:
- `type == 3` 的为 `"PLR"` 数据
- `type == 2` 的为 `"LR"` 数据
最终输出格式要求如下:
```json
{
"2024": [
{
"1": [
{"PLR": [...]},
{"LR": [...]}
]
},
...
],
"2025": [...]
}
```
---
### ✅ 实现代码(Java + FastJSON)
```java
import com.alibaba.fastjson.*;
import java.util.*;
public class TransformData {
public static void main(String[] args) {
String jsonStr = "{\"dimName\":\"模型分值\",\"echatsName\":\"私家车燃油车\",\"map\":{\"x\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\"],\"y\":[{\"name\":\"2024 - 求和项:CUR_REAL_ANP_ADJ\",\"ratio\":[0.215,0.127,0.1083,0.0989,0.0899,0.0819,0.0763,0.0715,0.0665,0.0607],\"type\":\"1\"},{\"name\":\"2024 - 求和项:PLR\",\"ratio\":[0.4833,0.5622,0.6001,0.6325,0.6656,0.7,0.7401,0.7892,0.8639,1.0385],\"type\":\"3\"},{\"name\":\"2024 - 求和项:LR\",\"ratio\":[0.4237,0.4333,0.6267,0.5871,0.5951,0.6223,0.837,0.8298,0.6898,0.8478],\"type\":\"2\"}],\"issueMonth\":[\"2024 - 求和项:CUR_REAL_ANP_ADJ\",\"2024 - 求和项:PLR\",\"2024 - 求和项:LR\"]},\"preFix\":\"分\",\"title\":\"提升效果\",\"type\":\"2\"}";
JSONObject data = JSON.parseObject(jsonStr);
JSONObject map = data.getJSONObject("map");
JSONArray xList = map.getJSONArray("x");
JSONArray yArray = map.getJSONArray("y");
// 构建年份 -> 数据的映射
Map<String, Map<String, List<Double>>> plrMapByYear = new HashMap<>();
Map<String, Map<String, List<Double>>> lrMapByYear = new HashMap<>();
for (Object obj : yArray) {
JSONObject item = (JSONObject) obj;
String name = item.getString("name");
String typeStr = item.getString("type");
JSONArray ratioArray = item.getJSONArray("ratio");
int type = Integer.parseInt(typeStr);
// 提取年份
String year = name.split(" - ")[0];
Map<String, List<Double>> plrMap = plrMapByYear.computeIfAbsent(year, k -> new LinkedHashMap<>());
Map<String, List<Double>> lrMap = lrMapByYear.computeIfAbsent(year, k -> new LinkedHashMap<>());
if (type == 3) { // PLR
for (int i = 0; i < xList.size(); i++) {
String key = xList.getString(i);
double val = ratioArray.getDoubleValue(i);
plrMap.computeIfAbsent(key, k -> new ArrayList<>()).add(val);
}
} else if (type == 2) { // LR
for (int i = 0; i < xList.size(); i++) {
String key = xList.getString(i);
double val = ratioArray.getDoubleValue(i);
lrMap.computeIfAbsent(key, k -> new ArrayList<>()).add(val);
}
}
}
// 合并生成目标结构
JSONObject result = new JSONObject();
for (String year : plrMapByYear.keySet()) {
Map<String, List<Double>> plrMap = plrMapByYear.get(year);
Map<String, List<Double>> lrMap = lrMapByYear.getOrDefault(year, Collections.emptyMap());
JSONArray dataArray = new JSONArray();
for (String key : xList.toJavaList(String.class)) {
JSONArray combined = new JSONArray();
JSONObject plrObj = new JSONObject();
plrObj.put("PLR", plrMap.getOrDefault(key, Collections.emptyList()));
combined.add(plrObj);
JSONObject lrObj = new JSONObject();
lrObj.put("LR", lrMap.getOrDefault(key, Collections.emptyList()));
combined.add(lrObj);
JSONObject entry = new JSONObject();
entry.put(key, combined);
dataArray.add(entry);
}
result.put(year, dataArray);
}
System.out.println(result.toJSONString());
}
}
```
---
### ✅ 输出结果说明
该程序会将输入数据转换为如下结构:
```json
{
"2024": [
{
"1": [
{"PLR": [0.4833, ...]},
{"LR": [0.4237, ...]}
]
},
...
]
}
```
其中每个 `"x"` 键对应的值是一个数组,里面包含两个对象:
- 一个是 `"PLR"` 数组
- 一个是 `"LR"` 数组
---
### ✅ 使用说明
- **依赖库**:使用了阿里巴巴的 `fastjson`,确保引入以下 Maven 依赖:
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
```
- 如果你希望支持多个年份(例如 `2025`),只需在 `map.y` 中添加对应名称为 `"2025 - 求和项:PLR"` 的条目即可。
---
###
阅读全文
相关推荐
















