我有一个包含一些数据的 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
在下面的循环中,您要打印值,请替换 list
与 jsonsByCode.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/