【问题标题】:Shuffling the list inside JSON Array改组 JSON 数组中的列表
【发布时间】: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 数组。

标签: java android json android-studio


【解决方案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。如果您需要更多代码,请告诉我您需要什么,我会用代码添加另一个答案。
    • 非常感谢您的帮助和回答。我先试试这个。
    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 2023-01-14
    • 2019-10-09
    • 2019-06-23
    • 2018-09-02
    • 2019-02-15
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多