diff --git a/src/main/java/dev/zarr/zarrjava/v2/DataType.java b/src/main/java/dev/zarr/zarrjava/v2/DataType.java index a0bbd731..39401716 100644 --- a/src/main/java/dev/zarr/zarrjava/v2/DataType.java +++ b/src/main/java/dev/zarr/zarrjava/v2/DataType.java @@ -1,5 +1,6 @@ package dev.zarr.zarrjava.v2; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; public enum DataType implements dev.zarr.zarrjava.core.DataType { @@ -32,6 +33,24 @@ public enum DataType implements dev.zarr.zarrjava.core.DataType { this.endianness = endianness; } + @JsonCreator + public static DataType fromValue(String value) { + for (DataType dataType : values()) { + if (dataType.getValue().equals(value)) { + return dataType; + } + } + // byte order is irrelevant for single-byte types, but numpy accepts (and some writers emit) "u1" + if (value.startsWith(Endianness.LITTLE.getValue()) || value.startsWith(Endianness.BIG.getValue())) { + for (DataType dataType : values()) { + if (dataType.endianness == Endianness.UNSPECIFIED && dataType.dtype.equals(value.substring(1))) { + return dataType; + } + } + } + throw new IllegalArgumentException("Unsupported data type: " + value); + } + public Endianness getEndianness() { return endianness; } diff --git a/src/test/java/dev/zarr/zarrjava/ZarrV2Test.java b/src/test/java/dev/zarr/zarrjava/ZarrV2Test.java index 310fae62..14e3351f 100644 --- a/src/test/java/dev/zarr/zarrjava/ZarrV2Test.java +++ b/src/test/java/dev/zarr/zarrjava/ZarrV2Test.java @@ -18,6 +18,8 @@ import java.io.BufferedReader; import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; @@ -609,6 +611,16 @@ public void testZarrJsonFormat(Functionu1,UINT8", ">i1,INT8", "u2,UINT16_BE"}) + public void testReadDataTypeWithAnyByteOrder(String dtype, DataType expected) throws ZarrException, IOException { + StoreHandle storeHandle = new MemoryStore().resolve("array"); + storeHandle.resolve(ZARRAY).set(ByteBuffer.wrap(("{\"zarr_format\": 2, \"shape\": [2], \"chunks\": [2], " + + "\"dtype\": \"" + dtype + "\", \"compressor\": null, \"fill_value\": 0, \"filters\": null, " + + "\"order\": \"C\"}").getBytes(StandardCharsets.UTF_8))); + Assertions.assertEquals(expected, Array.open(storeHandle).metadata().dataType); + } + @Test public void testMemoryStore() throws ZarrException, IOException { StoreHandle storeHandle = new MemoryStore().resolve();