=== Registering MapCodecCodecs for Dispatch Subcodecs ===
+
+
When registering a subcodec to any dispatch codec registry, the registered subcodec should be an instance of MapCodecCodec, or the subcodec will be nested in its own object when serialized.
+
+
For example, suppose we register a single-field subcodec, where we use fieldOf-and-xmap to convert an int to our int-holding Thing:
+
+
<syntaxhighlight lang="java">
+
public record Thing(int n){}
+
public static Codec<Thing> CODEC = Codec.INT.fieldOf("n").codec().xmap(Thing::new, Thing::n);
+
</syntaxhighlight>
+
+
This results in this json when serialized:
+
+
<syntaxhighlight lang="json">
+
"some_thing":
+
{
+
"type": "ourmod:thing",
+
"value": {
+
"n": 5
+
}
+
}
+
</syntaxhighlight>
+
+
This occurs because xmap does not produce a MapCodecCodec, and if this nested object is not desired, then our registered subcodec must be a MapCodecCodec.
+
+
However, fieldOf() produces a MapCodec, which has a codec() method, which does produce a MapCodecCodec. We can rearrange our codec builder, which then produces a cleaner json:
+
+
<syntaxhighlight lang="java">
+
public static Codec<Thing> CODEC = Codec.INT // Primitive codec
+
.fieldOf("n") // MapCodec
+
.xmap(Thing::new, Thing::n) // MapCodec
+
.codec(); // MapCodecCodec! That's what we want.
+
</syntaxhighlight>
+
+
<syntaxhighlight lang="json">
+
"some_thing":
+
{
+
"type": "ourmod:thing",
+
"n": 5
+
}
+
</syntaxhighlight>
+
+
RecordCodecBuilder also produces MapCodecCodecs.
=External Links=
=External Links=
* [https://github.com/Mojang/DataFixerUpper/blob/master/src/main/java/com/mojang/serialization/Codec.java Codecs in Mojang's official public DataFixerUpper repository]
* [https://github.com/Mojang/DataFixerUpper/blob/master/src/main/java/com/mojang/serialization/Codec.java Codecs in Mojang's official public DataFixerUpper repository]