GoodforGod / java-etherscan-api

🔗 Polished Java library for EtherScan.io API
https://etherscan.io
MIT License
56 stars 41 forks source link

Suggest adding custom features to Gson for LocalDateTime and LocalDate #18

Closed marklee1972 closed 2 years ago

marklee1972 commented 2 years ago

Since use com.google.gson.Gson to parse the json of Etherscan's api response. However the error will appear: io.api.etherscan.error.ParseException: Unable to make field private final java.time.LocalDate java.time.LocalDateTime.date accessible: module java.base does not "opens java.time" to unnamed module @38d8f54a

The reason is at: io.api.etherscan.core.impl.BasicProvider

Line 47: this.gson = new Gson();

I change the below code to fix this issuse:

this.gson = new GsonBuilder()
                .registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (src, typeOfSrc, context) -> new JsonPrimitive(src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))))
                .registerTypeAdapter(LocalDate.class, (JsonSerializer<LocalDate>) (src, typeOfSrc, context) -> new JsonPrimitive(src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))))
                .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) -> {
                    String datetime = json.getAsJsonPrimitive().getAsString();
                    return LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                }).registerTypeAdapter(LocalDate.class, (JsonDeserializer<LocalDate>) (json, type, jsonDeserializationContext) -> {
                    String datetime = json.getAsJsonPrimitive().getAsString();
                    return LocalDate.parse(datetime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                }).create();

Maybe the best way is either update the source code or supply a custom features.

GoodforGod commented 2 years ago

Hello, thanks for the issue, I will look into it and thanks for the details and provided code!

GoodforGod commented 2 years ago

Can you please tell what is endpoint/method library fails and what JDK version you used?

marklee1972 commented 2 years ago

Can you please tell what is endpoint/method library fails and what JDK version you used?

Yep JDK JavaSE-1.8(jdk17.0.1) Both MAINNET and ROPSTEN are the same error. When querying for a transaction, it happens.

List tx = api.account().txs(ADDRESS);

GoodforGod commented 2 years ago

Thanks for the info! Investigating and will release fix soon as possible