改组 JSON 数组中的列表
Posted
技术标签:
【中文标题】改组 JSON 数组中的列表【英文标题】:Shuffling the list inside JSON Array 【发布时间】:2021-09-06 20:40:21 【问题描述】:有人可以建议一种方法来打乱 JSON 数组中的列表吗?
假设我有如下所示的 JSON 数组:
data:[
"name" : "John",
"age":30,
"cars":["Ford", "BMW", "Fiat"],
"name" : "Adam",
"age":31,
"cars":["Toyota", "Fiat", "Honda"]
,
"name" : "Tony",
"age":25,
"cars":["VW", "Mercedes", "Toyota"]
]
如何对 JSON 数据数组中的列表进行洗牌,以便获得新数据:
shuffledData:[
"name" : "Adam",
"age":31,
"cars":["Toyota", "Fiat", "Honda"]
,
"name" : "Tony",
"age":25,
"cars":["VW", "Mercedes", "Toyota"]
,
"name" : "John",
"age":30,
"cars":["Ford", "BMW", "Fiat"]
]
我是否需要先将 JSON 数组列表转换为常规数组列表,然后执行 collections.shuffle,然后再将其转换回 JSON 数组列表?这看起来很复杂。
感谢您的帮助。
谢谢!
【问题讨论】:
好吧,如果您想在 Java 中执行此操作,您需要先将数组转换为列表,然后再随机播放。您也许可以编写直接在 JSON 上运行的东西,但这会更加复杂。但是,如果您可以访问 javascript,例如通过使用 Kotlin,您可以使用它直接处理 JSON 数组。 【参考方案1】:public static JSONArray shuffleJsonArray (JSONArray array) throws JSONException
// Implementing Fisher–Yates shuffle
Random rnd = new Random();
for (int i = array.length() - 1; i >= 0; i--)
int j = rnd.nextInt(i + 1);
// Simple swap
Object object = array.get(j);
array.put(j, array.get(i));
array.put(i, object);
return array;
【讨论】:
【参考方案2】:您的建议并不复杂。如果您想尝试一下,我会留在这里:
首先您必须为 JSONArray 的对象创建一个类。让我们称之为 PersonCars
public class PersonCars
public String name;
public Integer age;
public ArrayList<String> car;
//All getters, setters and constructors
然后,将您的 JSONArray 解析为带有 jackson 库的列表:
import com.fasterxml.jackson.databind.ObjectMapper;
...
ObjectMapper mapper = new ObjectMapper();
List<PersonCars> myObjects = mapper.readValue(jsonArray, new TypeReference<List<PersonCars>>());
使用 Collections.shuffle(myObjects) 进行随机化并将列表转换为 JSONArray:
String json = mapper.writeValueAsString(list);
我知道这有点长,但是如果您想更改数组中的其他内容,您可以在 java 对象中使用它。
【讨论】:
感谢您的建议!我会试试这个。我是否需要将 JSONArray 中的所有值解析为新列表?假设我只关心字符串名称和整数年龄。当我将值映射回 json 时,这仍然有效吗?我可以,新的 json 将只有名称和年龄,只要它们现在按顺序排列即可。为了清楚起见,我仍然可以在它已经被洗牌之后使用 json.getString("name") 来调用字符串名称? 如果您说您将 json 解析为只有名称和年龄字段的类,我认为这也可以。第二个问题,您必须获取字符串 json(您使用 writeValueAsString 获得)并将其解析为 JSONObject(例如,JSONObject jsonobject = new JSONObject(json)),并且此 JSONObject 将具有与原始 json 相同的结构,因此您可以获取数组“data”arraydata = jsonobject.getJSONArray("data") 并导航 JSONArray。如果您需要更多代码,请告诉我您需要什么,我会用代码添加另一个答案。 非常感谢您的帮助和回答。我先试试这个。以上是关于改组 JSON 数组中的列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?