Java - 根据对象使用JSON库从json读取数据

标签 java json

我有一个包含一些数据的 JSON,我想按如下方式打印

10 REGISTER 1, KP SUM 2081,606
20 REGISTER 2 CH SUM 0,22

其中总和是根据代码将各项的总和计算出来的。

按照规则,首先将数量乘以单位,然后将所有具有相同代码的商品相加。

示例:

code 10
SUM = 0,0200000 * 7,40 + 10,0000000 * 200,31 + 0,5690000 * 40,19 + 0,7890000 * 70,33

JSON 中出现的其他代码也是如此

我的 JSON

    [
      {
        "code": 10,
        "description": "REGISTER 1",
        "unity": "KP",
        "typeItem": "I",
        "itemCode": 1,
        "descriptionItem": "ITEM",
        "unityItem": "UN",
        "quantity": "0,0200000",
        "valueUnity": "7,40"
      },
      {
        "code": 10,
        "description": "REGISTER 1",
        "unity": "KP",
        "typeItem": "I",
        "codeItem": 2,
        "descriptionItem": "ITEM 2",
        "unityItem": "UN",
        "quantity": "10,0000000",
        "valueUnity": "200,31"
      },
      {
        "code": 10,
        "description": "REGISTER 1",
        "unity": "KP",
        "typeItem": "I",
        "codeItem": 88248,
        "descriptionItem": "ITEM 3",
        "unityItem": "H",
        "quantity": "0,5690000",
        "valueUnity": "40,19"
      },
      {
        "code": 10,
        "description": "REGISTER 1",
        "unity": "KP",
        "typeItem": "I",
        "codeItem": 88267,
        "descriptionItem": "ITEM 4",
        "unityItem": "N",
        "quantity": "0,7890000",
        "valueUnity": "70,33"
      },
      {
        "code": 20,
        "description": "REGISTER 2",
        "unity": "CH",
        "typeItem": "I",
        "codeItem": 1,
        "descriptionItem": "ITEM 1",
        "unityItem": "H",
        "quantity": "30,0000000",
        "valueUnity": "0,17"
      },
      {
        "code": 20,
         "description": "REGISTER 2",
        "unity": "CH",
        "typeItem": "I",
        "codeItem": 2,
        "descriptionItem": "ITEM 2",
        "unityItem": "H",
        "quantity": "3,0000000",
        "valueUnity": "0,07"
      }
    ]

我的Java课

    public class MyJson {
    @SerializedName("code")
        @Expose
        private Integer code;

        @SerializedName("description")
        @Expose
        private String description;

        @SerializedName("unity")
        @Expose
        private String unity;

        @SerializedName("typeItem")
        @Expose
        private String typeItem;

        @SerializedName("codeItem")
        @Expose
        private Integer codeItem;

        @SerializedName("descriptionItem")
        @Expose
        private String descriptionItem;

        @SerializedName("unityItem")
        @Expose
        private String unityItem;

        @SerializedName("quantity")
        @Expose
        private String quantity;

        @SerializedName("valueUnity")
        @Expose
        private String valueUnity;

        private Double total;

    }

我的程序

    public static void main(String[] args) {

            Gson gson = new Gson();

                try {

                    File jsonFile = new File("C:\\my_json.json");
                    InputStreamReader reader = new InputStreamReader(new FileInputStream(jsonFile), "UTF-8");
                    BufferedReader jsonBuffer = new BufferedReader(reader);

                    MyJson[] myJsonArray = gson.fromJson(jsonBuffer, MyJson[].class);  

                    BigDecimal valueUnity = BigDecimal.ZERO;
                    BigDecimal sumTotal = BigDecimal.ZERO;
                    //
                    Set<MyJson> list = new HashSet<>();

                    for(MyJson myJson : myJsonArray) {

                        if(checkStringNullOrEmpty(myJson.getQuantity()) && checkStringNullOrEmpty(myJson.getValueUnity())) {

                            if(myJson.getCode().equals(myJson.getCode())) {
                                String value1 = myJson.getQuantity().replaceAll( "," , "." ).trim();
                                String value2 = myJson.getValueUnity.replaceAll( "," , "." ).trim();
                                BigDecimal quantity = new BigDecimal(value1);
                                BigDecimal valueUnit = new BigDecimal(value2);
                                valueUnity = quantity.multiply(valueUnit);
                                somaTotal = sumTotal.add(valueUnity);
                                String resultado = String.format(Locale.getDefault(), "%.2f", valueUnity);
                                String sumTotal2 = String.format(Locale.getDefault(), "%.2f", sumTotal);
                                myJson.setTotal(new Double(sumTotal2.replaceAll( "," , "." ).trim()));
                                list.add(myJson);

                            }
                        }

                    }

                    for(MyJson myJson : list) {
                        StringBuilder builer = new StringBuilder();
                        builer.append(myJson.getCode()).append(" ");
                        builer.append(myJson.getDescription().toUpperCase()).append(" ");
                        builer.append(myJson.getUnity().toUpperCase()).append(" ");
                        builer.append(myJson.getTotal());

                        System.out.println(builer.toString());
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

        private static boolean checkStringNullOrEmpty(String value) {
            if(!value.isEmpty()) {
                return true;
            } else {
                return false;
            }
        }

Exit program

使用Set时计算错误

10 REGISTER 1, KP SUM 130,33
20 REGISTER 2 CH SUM 439,18

最佳答案

您无法使用一个总计来跟踪多个运行总计(即每个代码一个)。相反,您需要为每个不同的代码提供一个总计。

我建议您使用 Map<Integer, MyJson>以此目的。这将存储一些 MyJson您可以通过其代码查找的对象。处理每个MyJson时对象,你检查一下是否已经有 MyJson具有相同代码的对象:如果这样做,则添加到其总数中,否则添加 MyJson map 对象。

摆脱你的Set<MyJson>变量(您的名称有点令人困惑 list )并将其替换为以下内容

            Map<Integer, MyJson> jsonsByCode = new LinkedHashMap<>();

(您可以在此处使用 HashMap<> 而不是 LinkedHashMap<>:我选择使用 LinkedHashMap<> 因为它保持其条目的插入顺序相同。)

然后,替换 somaTotal = sumTotal.add(valueUnity); 中的所有行至list.add(myJson);

                    if (jsonsByCode.containsKey(myJson.getCode())) {
                        // We've seen this code before, so add the value
                        // to the total.
                        MyJson matchingJson = jsonsByCode.get(myJson.getCode());
                        matchingJson.setTotal(matchingJson.getTotal() + valueUnity.doubleValue());
                    } else {
                        // First time seeing this code, so set its total
                        // and add it to the map.
                        myJson.setTotal(valueUnity.doubleValue());
                        jsonsByCode.put(myJson.getCode(), myJson);
                    }

(请注意,BigDecimal 值(例如 valueUnity)具有 .doubleValue() 方法,这是将它们转换为 double 的最简单方法。)

然后,在 for在下面的循环中,您要打印值,请替换 listjsonsByCode.values() .

我对您的程序进行了这些更改,它生成了以下输出:

10 REGISTER 1 KP 2081.60648
20 REGISTER 2 CH 5.31

<小时/> 顺便说一句,您的代码还包含以下 if声明:

        if(myJson.getCode().equals(myJson.getCode())) {
            // ....
        }

您正在比较myJson.getCode()反对自己,所以这个条件将永远是 true (当然,除非 myJson.getCode() 返回 null ,在这种情况下您会得到 NullPointerException )。你可以去掉这个检查,它没有任何用处。

关于Java - 根据对象使用JSON库从json读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62358645/

相关文章:

javascript - Uncaught Error : Error calling method on NPObject.

Java套接字从客户端向服务器发送数据

java - 包含 Action 监听器 block 的适当位置是什么

java - 为什么输出是int?

java - 如何限制 EJB 实例的数量?

java - 如何安全地使用 ArrayList 子列表以避免首次进入

json - 使用 Apps 脚本 API 创建新的 Apps 脚本文件 - 错误 - 收到无效的 JSON 负载

javascript - 是否可以读取另一台服务器中的 json 文件,如何读取?

javascript - 为多维数组中的节点赋值 javascript

javascript - 关联数组元素与对象字段相同吗?