Java中如何从字符串数组生成指定JSON结构?解决值覆盖问题
解决Java中循环生成嵌套JSON结构只保留最后一个值的问题
我看你现在的问题很典型——循环里复用同一个JSONObject导致数据被覆盖,同时没把数组对应元素绑定到独立的JSON结构里。咱们一步步来解决:
问题根源分析
你当前代码的核心问题:
- 复用JSONObject实例:在循环外创建
TP1、TP2,每次循环调用put都会覆盖之前的键值,最后只保留最后一次赋值 - 数组元素未对应绑定:你分别遍历四个数组,没有把同一索引的
usersays_text、textString、entityType、alias元素关联到同一个TP结构,导致所有值都挤到一个对象里
修正后的代码
import org.json.JSONArray; import org.json.JSONObject; public class JsonGenerator { public static void main(String[] args) { String[] alias = {"topping", "cake"}; String[] entityType = {"Topping", "cake"}; String[] textString = {"pizza", "pancake"}; String[] usersays_text = {"I want ", "I want "}; JSONArray JSA4 = new JSONArray(); // 按索引遍历,确保同一位置的数组元素对应到同一个TP结构 for (int i = 0; i < usersays_text.length; i++) { // 每次循环创建新的JSONObject,避免覆盖 JSONObject TP1 = new JSONObject(); TP1.put("text", usersays_text[i]); JSONObject TP2 = new JSONObject(); TP2.put("alias", alias[i]); TP2.put("text", textString[i]); TP2.put("entityType", entityType[i]); JSONArray JSA = new JSONArray(); JSA.put(TP1); JSA.put(TP2); JSONObject root1 = new JSONObject(); root1.put("parts", JSA); // 将每个独立的parts结构添加到TP数组 JSA4.put(root1); } JSONObject root3 = new JSONObject(); root3.put("TP", JSA4); // 格式化输出 System.out.println(root3.toString(4)); } }
关键改动说明
- 按索引循环:改用
for(int i=0;...)遍历,这样能把四个数组中同一位置的元素绑定到同一个TP结构,保证数据对应关系正确 - 循环内创建新对象:每次循环都新建
TP1、TP2、root1,确保每个迭代生成独立的JSON对象,不会被后续循环覆盖 - 逐层构建结构:先构建每个
parts里的两个对象,再组成parts数组,最后把每个parts结构添加到顶层的TP数组中
输出结果(符合期望)
{ "TP": [ { "parts": [ { "text": "I want " }, { "alias": "topping", "text": "pizza", "entityType": "Topping" } ] }, { "parts": [ { "text": "I want " }, { "alias": "cake", "text": "pancake", "entityType": "cake" } ] } ] }
内容的提问来源于stack exchange,提问作者Yugul Sharma
相关产品推荐
相关产品推荐

