Parse Minecraft-relative JSON to structured objects
This project has been archived.
The maintainers of this project have marked this project as archived. No new releases are expected.
Project description
minecraft-schemes
A Python library for help you to parse Minecraft-relative JSON to structured objects.
Disclaimer: Although the project name contains "minecraft", this project is not supported by Mojang Studios or Microsoft.
Features
Already implemented
- Easy installing
- Open source
- All public APIs are static typed
- Supports parsing various file structures used by Mojang and Minecraft (see below)
- Easy-to-use file structure definitions, powered by
attrs - Rapidly file parsing, powered by
cattrs - Conditional testing for game/command line options and dependency libraries (in
client.json)
Not implemented yet (not a complete list)
- Export the data structures to the file
- Parse/build supports for
launcher_profiles.json(used by official Minecraft Launcher) - Search/exactly find a specified version in
version_manifest.json - Game/JVM command line options concatenating and completing
Supported file structures
Click link to see the corresponding documentations.
version_manifest.jsonandversion_manifest_v2.json[Minecraft Wiki]- A JSON file that list Minecraft versions available in the official launcher.
client.json[Minecraft Wiki]- A JSON file that accompanies client.jar in
.minecraft/versions/<version>and lists the version's attributes. - Usually named
<game version>.json. - Don't confuse this file with
version.json; they are fundamentally different.
- A JSON file that accompanies client.jar in
- Asset index
file [Minecraft Wiki (only Chinese version)]
- A series of JSON files used to query the hash value of the corresponding hashed resource file based on the resource path, in order to invoke the file.
- Can be downloaded from the URL pointed in the
client.json:[Root Tag] > "assetIndex" > "url"
version.json[Minecraft Wiki]- A JSON file that offers some basic information about the version's attributes.
- Embedded within client.jar in
.minecraft/versions/<version>andserver.jar. - Don't confuse this file with
client.json; they are fundamentally different.
- Mojang Java Runtime index file and manifest files
- A JSON file that list manifest files of Java Runtime provided by Mojang via their "codename".
- Not documented by Minecraft Wiki or Mojang, but it is believed to be for the purposes described above.
Install
Install minecraft-schemes using pip:
pip install minecraft-schemes
The release page also provides various versions of wheel files for manual download and installation.
Usage Example
Parse version_manifest.json (download at here)
import mcschemes
with open('version_manifest.json', mode='r') as f:
version_manifest = mcschemes.load(f, mcschemes.Scheme.VERSION_MANIFEST)
print('Latest release:', version_manifest.latest.release)
print('Latest snapshot:', version_manifest.latest.snapshot)
print('Number of available versions:', len(version_manifest.versions))
for entity in version_manifest.versions:
if entity.type == 'release':
print('The ID of the first release version found:', entity.id)
print('The release time of the first release version found:', entity.releaseTime)
print('The last update time of the first release version found:', entity.time)
break
Parse client.json
This example code uses client.json from Minecraft Java Edition
1.21.11, download at here.
import mcschemes
with open('1.21.11.json', mode='r') as f:
client_manifest_1_21_11 = mcschemes.load(f, mcschemes.Scheme.CLIENT_MANIFEST)
print('Version ID:', client_manifest_1_21_11.id)
# The following field is structured as a member of enum mcschemes.enums.VersionType
print('Version Type:', str(client_manifest_1_21_11.type))
print('Asset version ID:', client_manifest_1_21_11.assetIndex.id)
print('Main class:', client_manifest_1_21_11.mainClass)
print('Release time:', client_manifest_1_21_11.releaseTime)
print('Last update time:', client_manifest_1_21_11.time)
print('Number of dependency libraries:', len(client_manifest_1_21_11.libraries))
client_jar_file_info = client_manifest_1_21_11.downloads.get('client')
if client_jar_file_info:
print('URL to download the client JAR file:', client_jar_file_info.url)
Parse asset index file
This example code uses the asset index file version 29. You can download it at here.
from pathlib import Path
import mcschemes
with open('29.json', mode='r') as f:
asset_index = mcschemes.load(f, mcschemes.Scheme.ASSET_INDEX)
print('Number of asset files:', len(asset_index.objects))
asset_file_relative_path = Path('icons/icon_256x256.png')
if asset_file_relative_path in asset_index.objects:
target_asset_file_info = asset_index.objects[asset_file_relative_path]
print('Information about asset file {0}: hash={1.hash}, size={1.size}'.format(asset_file_relative_path, target_asset_file_info))
Parse version.json from a client JAR file
This example code uses the client JAR file from Minecraft Java Edition 1.21.11. You can download it in official Minecraft Launcher or at here.
from pathlib import Path
import mcschemes
version_attrs = mcschemes.loadVersionAttrsFromClientJar(Path.home().joinpath('.minecraft/versions/1.21.11/1.21.11.jar'))
print('Unique identifier of this client JAR:', version_attrs.id)
print('User-friendly name of this client JAR:', version_attrs.name)
print('Data version of this client JAR:', version_attrs.world_version)
print('Protocol version of this client JAR:', version_attrs.protocol_version)
print('Build time of this client JAR:', version_attrs.build_time)
if version_attrs.series_id:
print('Series ID (branch name) of this client JAR:', version_attrs.series_id)
Load client.json, then filter and concatenate command line
This example code uses client.json from Minecraft Java Edition
1.21.11, download at here.
Note: this example only demonstrates basic conditional filtering and concatenation operations, and does not consider the replacement of placeholder parameters (which may be supported in future versions).
import mcschemes
from mcschemes.tools import rules
with open('1.21.11.json', mode='r') as f:
client_manifest_1_21_11 = mcschemes.load(f, mcschemes.Scheme.CLIENT_MANIFEST)
features: dict[str, bool] = {
'is_demo_user' : True,
'has_custom_resolution': True
}
cmdline: list[str] = ['java']
for jvm_arg_entry in client_manifest_1_21_11.arguments.jvm:
if rules.isArgumentCanBeAppended(jvm_arg_entry, features=features):
cmdline.extend(jvm_arg_entry.value)
cmdline.append(client_manifest_1_21_11.mainClass)
for game_arg_entry in client_manifest_1_21_11.arguments.game:
if rules.isArgumentCanBeAppended(game_arg_entry, features=features):
cmdline.extend(game_arg_entry.value)
print('Concatenated command line (without placeholder replacements):', cmdline)
History
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Not planned yet.
[0.3.0] - 2026-01-31
Added
- Scheme: Added support for parsing version information files (the
version.jsonembedded withinclient.jar). - Scheme: Added parse support for index file of Mojang Java Runtimes, and file manifest of each java runtime.
- Parsing: Added a dedicated converter class in
mcschemes.tools.parser.Converter.DedicatedConverter.- This is intended to replace the
mcschemes.tools.parser.createConverter().
- This is intended to replace the
Backwards-incompatible Changes
-
Scheme:
mcschemes.assetindex.AssetIndexnow use thePathobject from the standard library'spathlibmodule to represent file relative paths in asset index files.-
Previously, it will use
strto represent file relative paths, so you can access information (e.g. hash, size) by the following way:from mcschemes.assetindex import AssetIndex asset_index: AssetIndex = ... # Some operations to obtain the json and structure it to the AssetIndex instance file_info = asset_index.objects['icons/icon_128x128.png'] [...] # Do your operations for file_info
-
Now, you need to use a
pathlib.Pathobject as the key to access the corresponding information:from pathlib import Path from mcschemes.assetindex import AssetIndex asset_index: AssetIndex = ... # Some operations to obtain the json and structure it to the AssetIndex instance file_info = asset_index.objects[Path('icons/icon_128x128.png')] [...] # Do your operations for file_info
-
Deprecations
- Parsing:
mcschemes.tools.parser.createConverter()is now marked as deprecated and will be removed in future versions.- Now pass a converter class based on
cattrs.Converterto the kw-only argumentconverter_classis no longer determines the type of the returned dedicated converter instance.
- Now pass a converter class based on
Changes
- Project metadata: This version history file has been revised to conform to the format described in Keep a Changelog.
- Project metadata: Fully updated the README file:
- Added a summary of the main features and benefits.
- Added a summary of file structures supported by this library.
- Usage example are now more useful and better represent typical use cases.
- Organizational: Reorganized the project structure:
mcschemes.tools.parsernow is a package.- Sub-package
mcschemes.tools.parser.convertersis added to contains dedicated converters.
- Sub-package
- Typing:
typing-extensionswas used instead of stdlibtypingfor better backward-compatibility for type annotation. - Scheme: Several changes for SHA-1 hexdigest container:
- The comparison between two
mcsehemes.specials.Sha1Suminstances now is based on the case-insensitive form of thehexdigestattribute of both. - The exception class
mcschemes.specials.ChecksumMismatchis now exposed.
- The comparison between two
- Parsing:
mcschemes.tools.parser.parse()now will check the second argumentschemein more robust way.
Fixed
- Tooling: Fixed a mistake when comparing the OS name in the function
mcschemes.tools.rules.isAllow().
[0.2.0] - 2025-12-11
Added
- Project metadata: Added
MANIFEST.infor setuptools. - Scheme: Added a SHA-1 hexdigest container type for
sha1/hashfields (un-)structuring. Its definition can be found at:mcschemes.specials.Sha1Sum. - Tooling: Added some tool functions to calculate a set of rules (iterable of
mcschemes.clientmanifest.nodes.RuleEntryinstances) means allow or disallow some operation, such as append an argument or download a library file.
Changes
- Project metadata: Declared build backend
setuptoolsintopyproject.toml. - Project metadata: According to PEP 561, an empty
py.typedis added into the root directory of package. - Project metadata: Corrected the date format for all tier-2 titles in this version history file.
- Organizational: Moved
typings.pyto the root directory of package.
[0.1.0.post1] - 2025-12-05
Changes
- Project metadata: Added project urls into
pyproject.toml. - Project metadata: Added disclaimer in
README.md.
[0.1.0] - 2025-12-04
Added
The initial release.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file minecraft_schemes-0.3.0.tar.gz.
File metadata
- Download URL: minecraft_schemes-0.3.0.tar.gz
- Upload date:
- Size: 25.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c19a3953f58f264e4c4468b3b1a17900a0392d9e4463434ffc8aa5494885725
|
|
| MD5 |
f583a058b5c1f7aa7d68b2344285112a
|
|
| BLAKE2b-256 |
e88d270405319eb0f2b6882410ab7c2f8745aeedc4b4a44658f5e85974bd4d76
|
File details
Details for the file minecraft_schemes-0.3.0-py3-none-any.whl.
File metadata
- Download URL: minecraft_schemes-0.3.0-py3-none-any.whl
- Upload date:
- Size: 26.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ab5fc1b6cbec9c2b99ecf041f4bc0aa803aa2129c4fd686bc8f38d77becc1fa
|
|
| MD5 |
0e139948e1a16071da7e7df7dae3b80f
|
|
| BLAKE2b-256 |
00aa5afce11f6da1b5b8fc2f434123140c178b8d466a6b4a19e5376b47d10709
|