如何将JSONArray转换为int数组?

11

我遇到了关于 JSONObject sayJSONHello() 方法的问题。

@Path("/hello")
public class SimplyHello {

    @GET
    @Produces(MediaType.APPLICATION_JSON)

     public JSONObject sayJSONHello() {      

        JSONArray numbers = new JSONArray();

        numbers.put(1);
        numbers.put(2);
        numbers.put(3);
        numbers.put(4);             

        JSONObject result = new JSONObject();

        try {
            result.put("numbers", numbers);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;
    }
}

在客户端,我想要获取一个int数组,[1, 2, 3, 4],而不是JSON。
{"numbers":[1,2,3,4]}

How can I do that?

Client code:

System.out.println(service.path("rest").path("hello")
    .accept(MediaType.APPLICATION_JSON).get(String.class));

我的方法返回一个JSONObject,但我想从中提取数字,以便对它们进行计算(例如作为int[])。
我将函数作为一个JSONObject接收。
 String y = service.path("rest").path("hello").accept(MediaType.APPLICATION_JSON).get(String.class);   
JSONObject jobj = new JSONObject(y);   
int [] id = new int[50];
 id = (int [] ) jobj.optJSONObject("numbers:"); 

然后我遇到了错误:无法将JSONObject强制转换为int[]

另外还有两种方法:

String y = service.path("rest").path("hello").accept(MediaType.APPLICATION_JSON).get(String.class);   
JSONArray obj = new JSONArray(y);  
int [] id = new int[50];      
 id = (int [] ) obj.optJSONArray(0);                                                     

这次我得到的是:无法从JSONArray转换为int[]...

无论如何它都不起作用。


2
你可以在客户端解析json并从JSONArray中获取数字,对吧?那会有多难? - Rahul
1
正如@benzonico所说,您可以访问JSON对象的“numbers”元素并获得对数组的访问权限。 - Noam Rathaus
你真的认为你期望的结果与它返回的结果不同吗?如果是的话,请输入你期望的JSON对象 :) - dharam
5个回答

19

我从未使用过这个,也没有测试过它,但是根据您的代码以及JSONObjectJSONArray的文档,我建议这样做。

// Receive JSON from server and parse it.
String jsonString = service.path("rest").path("hello")
    .accept(MediaType.APPLICATION_JSON).get(String.class);
JSONObject obj = new JSONObject(jsonString);

// Retrieve number array from JSON object.
JSONArray array = obj.optJSONArray("numbers");

// Deal with the case of a non-array value.
if (array == null) { /*...*/ }

// Create an int array to accomodate the numbers.
int[] numbers = new int[array.length()];

// Extract numbers from JSON array.
for (int i = 0; i < array.length(); ++i) {
    numbers[i] = array.optInt(i);
}

这对你的情况应该有效。在更严肃的应用中,你可能想要检查值是否确实为整数,因为optInt在值不存在或不是一个整数时返回0

获取与索引相关联的可选整数值。如果索引没有值,或者该值不是数字且不能转换为数字,则返回零。


顺便问一下,有没有办法在循环中发送数字而不使用 numbers.put(1); 这样的方式?例如,将发送500个数字。 - volly
@volly 不要忘记接受答案,如果有任何一个解决了你的问题。肯定有许多方法不用写每个数字。例如:for (int i = 1; i <= 500; ++i) { numbers.put(i); } 将数字从1到500(包括500)放入数组中。如果您已经有了另一个数组中的数字,则将常规数组复制到JSON数组的代码类似于此。例如:int[] myNumbers; /*...*/ for (int i = 0; i < myNumbers.length; ++i) { numbers.put(myNumbers[i]); } - afsantos

3

如果您可以接受一个List作为结果,并且可以使用Gson,那么有一种非常简单的方法可以做到这一点,只需要几行代码:

Type listType = new TypeToken<LinkedList<Integer>>() {}.getType();
List<Integer> numbers = new Gson().fromJson(jobj.get("numbers"), listType);

我知道这不完全是你要求的,但根据我的经验,整数列表可以用于许多与基本int[]相同的方式。有关如何将LinkedList转换为数组的更多信息,请参见如何使用`toArray()`将LinkedList转换为数组?


1

2023年5月

Java:

这里有一个简单的方法,可以处理将JSONArray转换为Int Array

public static int[] JSonArray2IntArray(JSONArray jsonArray){
    int[] intArray = new int[jsonArray.length()];
    for (int i = 0; i < intArray.length; ++i) {
        intArray[i] = jsonArray.optInt(i);
    }
    return intArray;
}

Kotlin :

val intArr = Array(jsonArr.length()) {jsonArr.getInt(it)}
  • intArr 是一个 Array<Int>
  • it 高阶函数按顺序为每个数组元素调用,从第一个元素开始。它应该根据索引返回数组元素的值。

-1

你也可以这样做

JSONArray numberArr=jsonObject.getJSONArray("numbers");

            int[] arr=new int[numberArr.length()];
            for(int k=0;k<numberArr.length();k++)
                 arr[k]=numberArr.getInt(k);

-2

不要使用 -

result.put("numbers", numbers);

你可以尝试一下(不过我还没有测试过)

result.put(numbers);

或者遍历数组“numbers”,并将每个数字单独放入“result”中。

JSONObject еҸҜиғҪжІЎжңү put(JSONArray) ж–№жі•гҖӮ - Danny
1
除非我错了,否则没有只有一个参数的 put 方法签名。它必须有一个键。 - Paul Richter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接