如何从输入中读取多个Json数组并将其转换为Java数组或List

zlwx9yxi  于 2023-08-08  发布在  Java
关注(0)|答案(2)|浏览(120)

我正在接收一个或多个Json数组的输入,如

[{"operation":"buy", "unit-cost":10.00, "quantity": 10000},
{"operation":"sell", "unit-cost":20.00, "quantity": 5000}]
[{"operation":"buy", "unit-cost":20.00, "quantity": 10000},
{"operation":"sell", "unit-cost":10.00, "quantity": 5000}]

字符串
我尝试使用JSON-Java以这种方式读取数组:

JSONArray array = new JSONArray(json)


但这只会读取第一个数组,而忽略第二个数组。
如何在Java中从Json String中读取多个数组?
我已经尝试过使用JSON-java和Jackson,但是我还没有找到获得预期结果的方法。

zynd9foi

zynd9foi1#

没有自动读取它的方法,因为对象是一个附加的对象数组。您必须自己以编程方式解析它。这里有一个可能的方法:

import java.util.ArrayList;
import org.json.*;

public class JsonTest {

    public static final void main(String... args){
        String str = "[{\"operation\":\"buy\", \"unit-cost\":10.00, \"quantity\": 10000},\n" +
                        "{\"operation\":\"sell\", \"unit-cost\":20.00, \"quantity\": 5000}]\n" +
                        "[{\"operation\":\"buy\", \"unit-cost\":20.00, \"quantity\": 10000},\n" +
                        "{\"operation\":\"sell\", \"unit-cost\":10.00, \"quantity\": 5000}]";

        // store all the arrays in a list
        ArrayList<JSONArray> jsonArrays = new ArrayList<>();
        
        int last, beg = last = 0;
        while(true){
            // substring up to ] and treat it as a json array
            last = str.indexOf("]", beg);
            if(last == -1) break;
            JSONArray arr = new JSONArray(str.substring(beg, last+1));
            jsonArrays.add(arr);
            beg = last+1;
        }
        
        // print all the json objects in the array list
        for(JSONArray arr : jsonArrays){
            for(int i = 0; i < arr.length(); i++){
                JSONObject obj = arr.getJSONObject(i);
                System.out.println(obj.toString());
            }
        }

    }
}

字符串

kfgdxczn

kfgdxczn2#

  • “我正在接收一个或多个Json数组的输入...*
  • ...在Java中如何从Json String中读取多个数组?..."*

您可以评估字符以判断何时达到完整数组。
在这个例子中,我忽略了括号可能出现在文本值中的事实。
你的数据似乎不是这样的,所以我省略了检查。

String string =
    "[{\"operation\":\"buy\", \"unit-cost\":10.00, \"quantity\": 10000},\n" +
    "{\"operation\":\"sell\", \"unit-cost\":20.00, \"quantity\": 5000}]\n" +
    "[{\"operation\":\"buy\", \"unit-cost\":20.00, \"quantity\": 10000},\n" +
    "{\"operation\":\"sell\", \"unit-cost\":10.00, \"quantity\": 5000}]";
List<String> list = new ArrayList<>();
int index = 0, offset = 0, count = 0;
for (char character : string.toCharArray()) {
    switch (character) {
        case '[' -> count++;
        case ']' -> {
            count--;
            if (count == 0) {
                list.add(string.substring(offset, index + 1).strip());
                offset = index + 1;
            }
        }
    }
    index++;
}

字符串
输出,为 list

0 = '[{"operation":"buy", "unit-cost":10.00, "quantity": 10000},
{"operation":"sell", "unit-cost":20.00, "quantity": 5000}]'
1 = '[{"operation":"buy", "unit-cost":20.00, "quantity": 10000},
{"operation":"sell", "unit-cost":10.00, "quantity": 5000}]'


然后,我使用 Gson 来解析数据。
我在这里使用了 SerializedName 注解来使带连字符的名称一致。
此外,我还添加了一个 toString 重写来调试输出。

class Data {
    String operation;
    @SerializedName("unit-cost") float unitCost;
    float quantity;

    @Override
    public String toString() {
        return "{operation= '%s', ".formatted(operation)
            + "unitCost= %s, ".formatted(unitCost)
            + "quantity= %s}".formatted(quantity);
    }
}


下面是一个基本的解析和输出。

Gson gson = new Gson();
List<Data[]> data = new ArrayList<>();
for (String value : list)
    data.add(gson.fromJson(value, Data[].class));

for (Data[] datum : data)
    System.out.println(Arrays.toString(datum));
[{operation= 'buy', unitCost= 10.0, quantity= 10000.0}, {operation= 'sell', unitCost= 20.0, quantity= 5000.0}]
[{operation= 'buy', unitCost= 20.0, quantity= 10000.0}, {operation= 'sell', unitCost= 10.0, quantity= 5000.0}]

的字符串

相关问题