改组 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 数组中的列表的主要内容,如果未能解决你的问题,请参考以下文章

在java中可逆地改组一个int数组[重复]

如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?

无法将json数组填充到数组列表android开发

更改从JSON数组创建的列表中的项目

Swifty JSON:将 JSON 数组中的对象分层列表转换为分层 Swift 对象

在 React 中映射 JSON 数组时如何使用 onClick 定位列表中的单个项目