【问题标题】:Mapping of JSON attributes to integers using Spring Java使用 Spring Java 将 JSON 属性映射到整数
【发布时间】:2020-03-21 18:27:22
【问题描述】:

我有很多以下格式的 JSON 文件。我想将一个名为 Timings 的属性映射到 integer

test.json

"Rating": {
  "ratingValue": "4.636365",
  "bestRating": "5",
  "worstRating": "1",
  "ratingCount": "66"
 },
 "Timings": {
  "cookTime": "PT1H",
  "prepTime": "PT10M",
  "totalTime": "PT1H10M"
 }

我想在映射后将输出存储在另一个 JSON 文件中。假设 Timings 中的 totalTime1H10M,那么我们将其指定为“totalTime:7”。如果是“30M”,我们可以将其指定为“totalTime:3”。我想用java来做这个。

所需输出

"Rating": 
{
  "ratingValue": "4.636365",
},
 "Timings": 
{
    "totalTime": "7"
}

【问题讨论】:

  • json 是否也会包含秒的计时数据?例如:"PT1H10M20S"
  • @AnishB。没有。只是小时和分钟
  • @AnishB 谢谢。我还需要将输出存储在 JSON 中。
  • @AnishB。检查更新的 Qs。我在Qs里写过。
  • @AnishB。我想设置一个查找表,在其中我对与整数映射的值范围进行校正。

标签: java json spring jackson


【解决方案1】:

我试过了:

class Timings {

    private String cookTime;
    private String prepTime;
    private String totalTime;

    public String getCookTime() {
        return cookTime;
    }

    public void setCookTime(String cookTime) {
        this.cookTime = cookTime;
    }

    public String getPrepTime() {
        return prepTime;
    }

    public void setPrepTime(String prepTime) {
        this.prepTime = prepTime;
    }

    public String getTotalTime() {
        return totalTime;
    }

    public void setTotalTime(String totalTime) {
        this.totalTime = totalTime;
    }

    @Override
    public String toString() {
        return "Timings [cookTime=" + cookTime + ", prepTime=" + prepTime + ", totalTime=" + totalTime + "]";
    }

}
public class Test {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Timings obj = mapper.readValue(new File("C:\\Users\\Anish\\Desktop\\abc.json"), Timings.class);
        String totalTime = obj.getTotalTime().split("PT")[1];
        int total = 0;
        if (totalTime != null && !totalTime.isEmpty()) {
            total = returnTotalTime(totalTime);
        }
        ObjectNode mainNode = mapper.createObjectNode();
        ObjectNode timingNode = mapper.createObjectNode();
        childNode.put("totalTime", (total > 9) ? (total / 10) : total);
        mainNode.set("Timings", timingNode);
        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mainNode);
        System.out.println(json);

    }

    private static int returnTotalTime(String totalTime) {
    if (totalTime != null && !totalTime.isEmpty()) {
        String[] timeValues = totalTime.split("H");
        if (timeValues.length == 0) {
            return 0;
        } else if (timeValues.length < 2) {
            if (timeValues[0].contains("M")) {
                return (timeValues[0].split("M").length <= 0) ? 0
                        : timeValues[0].split("M")[0].isEmpty() ? 0 : Integer.parseInt(timeValues[0].split("M")[0]);
            }
            return timeValues[0].isEmpty() ? 0 : Integer.parseInt(timeValues[0]) * 60;
        }
        int hour = timeValues[0].isEmpty() ? 0 : Integer.parseInt(timeValues[0]) * 60;
        int mins = (timeValues[1].split("M").length <= 0) ? 0
                : timeValues[1].split("M")[0].isEmpty() ? 0 : Integer.parseInt(timeValues[1].split("M")[0]);
        return (hour + mins);
    }
    return 0;
}

abc.json

{
  "cookTime": "PT1H",
  "prepTime": "PT10M",
  "totalTime": "PT1H10M"
}

输出:

{
  "Timings" : {
    "totalTime" : "7"
  }
}

"totalTime": "PT30M",那么:

输出:

{
  "Timings" : {
    "totalTime" : "3"
  }
}

"totalTime": "PT23M",那么:

输出:

{
  "Timings" : {
    "totalTime" : "2"
  }
}

【讨论】:

  • 感谢您的解决方案,我希望对此有所改进。每当我传递 10 的确切倍数时,它都会返回所需的答案。但是,当我输入`“totalTime”:“PT23M”`时,它会返回答案`“totalTime”:“23”`而不是`“totalTime”:“3”`。请弄清楚这一点。
  • 不,先生。这就是问题。我不需要23。我需要它是2。喜欢PT37M 我需要3
  • @Lily 完成。现在,检查更新的答案。我已经更改了代码。它适用于任何组合。
  • 这段代码在"totalTIme":"PT1H"`java.lang.ArrayIndexOutOfBoundsException: 1`时出错
  • @Lily 等着看。
【解决方案2】:

您可以根据自己的目标使用任何库来解析 Json 数据。

例如 org.json 是一个不错的选择,下面是一个示例:

JSONObject object = new JSONObject(stringData);
String time = object.getJSONObject("Timings").getString("cookTime");

这样你就可以解析每一个 Json 数据,然后再做你的业务。

您还可以使用 gson 或其他工具将数据映射到类。

【讨论】:

  • 如何将其映射到整数?
  • 在哪里进行查找以将其映射到整数值?
  • 作为getString方法,它也有getInt方法。但是您提到的json数据中的所有属性都是String。
  • 先生,我可以通过这种方法访问对象。但我也想在将其与查找进行比较后对其进行映射。
  • stringData 是什么?是指读取JSON文件的路径吗?我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2022-08-06
  • 2019-07-05
  • 2017-03-16
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多