Data Converter Issue when updating from 1.21.3 to 1.21.10
Open
Nobody has claimed this yet.
status: needs triage
version: 1.21.10
- Dominant language
- Java
- Stars
- 12.7k
- Forks
- 3.5k
- Avg merge
- 3d 13h
- Merged PRs (30d)
- 11
Description
Expected behavior
When updating, the server should successfully convert items stored in player data.
Observed/Actual behavior
When loading player files with certain items (an older book in this case), the server throws an exception.
Steps/models to reproduce
- Have a 1.21.3 Server with legacy items (the server has been around since ~2012).
- update to 1.21.10
- call OfflinePlayer.getName, which triggers a player data lookup
Plugin and Datapack List
[14:37:46 INFO]: ℹ Server Plugins (116):
[14:37:46 INFO]: Bukkit Plugins:
[14:37:46 INFO]: - AndaMisc, Announcer, AnvilSign, AreaShop, ArmorStandEditor, ArmorstandMessage, Asylaneous, AsylumAPI, AsylumFarm, AsylumLager
[14:37:46 INFO]: AsylumQuests, AsylumShops, AsylumTradingCardGame, AsylumTreasures, AsylumWeather, AutoRegions, *BetterAlias, BetterSnow, BookExploitFix, BuildContest
[14:37:46 INFO]: BungeeTabListPlus, BuycraftX, ChairPlugin, CleanroomGenerator, ClickSort, ColorMatrix, CraftBook, CraftingStore, DebugPlugin, DevTools
[14:37:46 INFO]: Doener, DrawIt, dynmap, DynmapMarkers, EasterEgg, EcoFlow, EcoFlow-Integration, *EliteLogs, ElytraCourseEaster2025, EmergencyPlan
[14:37:46 INFO]: EndlessDispense, EntityLimits, EntitySpawnCounter, Essentials, EssentialsChat, EssentialsSpawn, FairDragonEgg, FancyArmorStands, FancyItems, Feedback
[14:37:46 INFO]: FrameShow, HeadsAndSkulls, *HideStream, IntelliProtect, InvisibleItemFrames, JumpPlates, Kotlin, LML, LogBlock, *Lottery
[14:37:46 INFO]: LuckPerms, mapdisplay, MapFinalizer, Matrix, mcMMO, MobArena, ModAddon, ModularFix, Multiverse-Core, Multiverse-Inventories
[14:37:46 INFO]: Multiverse-NetherPortals, MyLittlePony, NoEggPort, Notify, PhantomControl, PlayerSigns, PlotMe, PlotMe-DefaultGenerator, PlotMeAddon, PluginInfo
[14:37:46 INFO]: PluginManager, PotionControl, PotionEffectRemover, ProfileAPI, ProtocolLib, *RedstoneClockDetector, Repopulator, Ruhm, ServerShield, Shopkeepers
[14:37:46 INFO]: SickAutoFarm, SickChatControl, SickLag, SickShit, SickVote, TabProtection, TeleportButtons, TransAsylum, *Treeversity, TsBot
[14:37:46 INFO]: Tutorial, uSkyBlock, *VanishNoPacket, Vault, ViaVersion, VillagerDefense, Votifier, VoxelSniper, Wands, WaterTempleFarm
[14:37:46 INFO]: WebPlugin, WgAddon, WorldBorder, WorldEdit, WorldEditSUI, WorldGuard
Paper version
[14:38:14 INFO]: Checking version, please wait...
[14:38:14 INFO]: This server is running Paper version 1.21.10-113-main@9fc21bc (2025-11-14T16:11:13Z) (Implementing API version 1.21.10-R0.1-SNAPSHOT)
You are running the latest version
Previous version: 1.21.3-81-da71382 (MC: 1.21.3)
Other
[14:28:08 ERROR]: [ca.spottedleaf.dataconverter.minecraft.versions.V4290] Failed to convert json to nbt: §0der mit seiner Macht vom Taj Besitz §r
§0ergriff. §r
§0An dieser Stelle, junge Padawane und §r
§0Padawaninnen tretet§r §4ihr§r §0auf den Plan.§r
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 1 column 8 path $
See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json
at com.google.gson.JsonParser.parseReader(JsonParser.java:116) ~[gson-2.11.0.jar:?]
at com.google.gson.JsonParser.parseString(JsonParser.java:92) ~[gson-2.11.0.jar:?]
at ca.spottedleaf.dataconverter.minecraft.versions.V4290$1.convert(V4290.java:235) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.datatypes.DynamicDataType.convert(DynamicDataType.java:82) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils.convert(WalkerUtils.java:89) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.versions.V4059$1.walk(V4059.java:94) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.versions.V4059$1.walk(V4059.java:20) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType.convert(MCDataType.java:115) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils.convert(WalkerUtils.java:21) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.versions.V3818.lambda$register$2(V3818.java:320) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.datatypes.IDDataType.convert(IDDataType.java:137) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.walkers.generic.WalkerUtils.convertList(WalkerUtils.java:41) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.versions.V1458.lambda$register$1(V1458.java:111) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType.convert(MCDataType.java:115) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.datatypes.MCDataType.convert(MCDataType.java:13) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertWithSubVersion(MCDataConverter.java:63) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convert(MCDataConverter.java:44) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(MCDataConverter.java:30) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at net.minecraft.world.level.storage.PlayerDataStorage.lambda$load$1(PlayerDataStorage.java:103) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at java.base/java.util.Optional.map(Optional.java:260) ~[?:?]
at net.minecraft.world.level.storage.PlayerDataStorage.load(PlayerDataStorage.java:101) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at org.bukkit.craftbukkit.CraftOfflinePlayer.getData(CraftOfflinePlayer.java:200) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at org.bukkit.craftbukkit.CraftOfflinePlayer.getBukkitData(CraftOfflinePlayer.java:204) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at org.bukkit.craftbukkit.CraftOfflinePlayer.getName(CraftOfflinePlayer.java:70) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at SickVote.jar/de.sickred.bukkit.sickvote.vote.PlayerStatus.updateNameInFile(PlayerStatus.java:60) ~[SickVote.jar:?]
at SickVote.jar/de.sickred.bukkit.sickvote.vote.PlayerStatus.<init>(PlayerStatus.java:50) ~[SickVote.jar:?]
at SickVote.jar/de.sickred.bukkit.sickvote.vote.VoteHandler.loadPlayerStatus(VoteHandler.java:72) ~[SickVote.jar:?]
at SickVote.jar/de.sickred.bukkit.sickvote.vote.VoteHandler.loadAllPlayersStatus(VoteHandler.java:40) ~[SickVote.jar:?]
at SickVote.jar/de.sickred.bukkit.sickvote.vote.VoteHandler.<init>(VoteHandler.java:24) ~[SickVote.jar:?]
at SickVote.jar/de.sickred.bukkit.sickvote.SickVote.onEnable(SickVote.java:79) ~[SickVote.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:279) ~[paper-api-1.21.10-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:202) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:109) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:520) ~[paper-api-1.21.10-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.CraftServer.enablePlugin(CraftServer.java:639) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:596) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at net.minecraft.server.MinecraftServer.initPostWorld(MinecraftServer.java:637) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:368) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1257) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at net.minecraft.server.MinecraftServer.lambda$spin$2(MinecraftServer.java:384) ~[paper-1.21.10.jar:1.21.10-113-9fc21bc]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 1 column 8 path $
See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1754) ~[gson-2.11.0.jar:?]
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1550) ~[gson-2.11.0.jar:?]
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:625) ~[gson-2.11.0.jar:?]
at com.google.gson.stream.JsonReader.peek(JsonReader.java:507) ~[gson-2.11.0.jar:?]
at com.google.gson.JsonParser.parseReader(JsonParser.java:111) ~[gson-2.11.0.jar:?]
... 40 more
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at ca.spottedleaf.dataconverter.minecraft.versions.V4290, following the conversion path from PlayerDataStorage.load and CraftOfflinePlayer.getName. Reproduce the 1.21.3-to-1.21.10 update with a legacy book, then determine how conversion should handle the malformed JSON so loading player data completes without the reported exception.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend, game-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100