diff --git a/http-api/src/main/java/net/runelite/http/api/gson/InstantTypeAdapter.java b/http-api/src/main/java/net/runelite/http/api/gson/InstantTypeAdapter.java index bf92af94b8..d5162c0e01 100644 --- a/http-api/src/main/java/net/runelite/http/api/gson/InstantTypeAdapter.java +++ b/http-api/src/main/java/net/runelite/http/api/gson/InstantTypeAdapter.java @@ -43,12 +43,7 @@ public class InstantTypeAdapter extends TypeAdapter return; } - out.beginObject() - .name("seconds") - .value(value.getEpochSecond()) - .name("nanos") - .value(value.getNano()) - .endObject(); + out.value(value.toEpochMilli()); } @Override @@ -60,6 +55,12 @@ public class InstantTypeAdapter extends TypeAdapter return null; } + if (in.peek() == JsonToken.NUMBER) + { + long jsTime = in.nextLong(); + return Instant.ofEpochMilli(jsTime); + } + long seconds = 0; int nanos = 0; in.beginObject(); diff --git a/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java b/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java index dab70a4f96..f9ed850843 100644 --- a/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java +++ b/http-api/src/test/java/net/runelite/http/api/gson/InstantTypeAdapterTest.java @@ -34,15 +34,20 @@ public class InstantTypeAdapterTest @Test public void test() { - test("null", null); - test("{\"seconds\":1609538310,\"nanos\":291698903}", Instant.ofEpochSecond(1609538310, 291698903)); + test("null", null, true); + test("{\"seconds\":1609538310,\"nanos\":291000000}", Instant.ofEpochSecond(1609538310, 291_000_000), false); + test("1609538310291", Instant.ofEpochSecond(1609538310, 291_000_000), true); } - private void test(String json, Instant object) + private void test(String json, Instant object, boolean exactEncoding) { Instant parsed = RuneLiteAPI.GSON.fromJson(json, Instant.class); Assert.assertEquals(object, parsed); String serialized = RuneLiteAPI.GSON.toJson(object); + if (exactEncoding) + { + Assert.assertEquals(json, serialized); + } Instant roundTripped = RuneLiteAPI.GSON.fromJson(serialized, Instant.class); Assert.assertEquals(object, roundTripped); } diff --git a/http-service/src/test/java/net/runelite/http/service/loottracker/LootTrackerControllerTest.java b/http-service/src/test/java/net/runelite/http/service/loottracker/LootTrackerControllerTest.java index 685479a638..68e64270d6 100644 --- a/http-service/src/test/java/net/runelite/http/service/loottracker/LootTrackerControllerTest.java +++ b/http-service/src/test/java/net/runelite/http/service/loottracker/LootTrackerControllerTest.java @@ -26,6 +26,7 @@ package net.runelite.http.service.loottracker; import java.io.IOException; import java.time.Instant; +import java.time.temporal.ChronoField; import java.util.Collections; import java.util.UUID; import javax.servlet.http.HttpServletRequest; @@ -88,7 +89,7 @@ public class LootTrackerControllerTest { LootRecord lootRecord = new LootRecord(); lootRecord.setType(LootRecordType.NPC); - lootRecord.setTime(Instant.now()); + lootRecord.setTime(Instant.now().with(ChronoField.NANO_OF_SECOND, 0)); lootRecord.setDrops(Collections.singletonList(new GameItem(4151, 1))); String data = RuneLiteAPI.GSON.toJson(Collections.singletonList(lootRecord));