gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:17:52 24 4
gpt4 key购买 nike

我有一个包含一些数据的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com