JSON tools

In the tools/json_tools/ folder you will find several scripts for working with JSON data, written in python and jq.

Keys and Values

The keys.py and values.py scripts are related, with similar usage:

  • keys.py counts how many times each key (field) occurs throughout all matching JSON data. You might use this to learn how many items have “weight” and/or “volume”, or what fields are used most often by “overmap_special” types, for example.

  • values.py counts how many times each value occurs in a given key (field). Use this if you want to know what different “volume” or “weight” values items have or to look up all “id” values from a set of matching items, for instance.

Run either script with -h to see help on their command-line options. Both scripts output JSON text by default, but you can pass the --human option for output in a more human-readable format.

You can run these scripts from the root Cataclysm-DDA directory using a relative path:

$ tools/json_tools/keys.py -h
$ tools/json_tools/keys.py --human type=TOOL
$ tools/json_tools/values.py --key material type=TOOL

Or, cd into the tools/json_tools directory and execute the Python scripts in that directory - it will still work the same:

$ cd tools/json_tools

$ ./keys.py -h
$ ./keys.py --human type=TOOL
$ ./values.py --key material type=TOOL

Examples

Here is keys.py showing how many TOOL types have each key defined (abbreviated for simplicity, since the full list is rather long). Out of 752 tools, all of them have type and name defined, but only some of them include pocket_data or longest_side:

$ tools/json_tools/keys.py --human type=TOOL

Count of keys
(Data from 752 out of 25050 blobs)
-------------
type         : 752
name         : 752
weight       : 656
pocket_data  : 143
looks_like   : 101
techniques   : 92
longest_side : 56
...

Here is values.py printing the number of TOOL type items having each material value. The MISSING column tells how many tools have no material defined in their JSON:

$ tools/json_tools/values.py --key material --human type=TOOL

Count of values from field 'material'
(Data from 752 out of 25050 blobs)
-------------
steel    : 295
plastic  : 245
MISSING  : 105
aluminum : 73
wood     : 70
glass    : 35
...

Show values of “longest_side” defined for TOOL type items in the weapon category, including how many items are missing an explicit value for “longest_side”:

$ tools/json_tools/values.py --key longest_side type=TOOL category=weapon

{"50 cm": 10, "40 cm", 1, "MISSING": 95, "20 cm": 2, "100 cm": 6, ...}

Pipe output to lister.py to get a distinct list of alphabetized keys from a JSON string. For example, to list all type values alone, without counting how many of each:

$ tools/json_tools/values.py --key type | tools/json_tools/lister.py

["AMMO", "ARMOR", "BATTERY", "BIONIC_ITEM", "BOOK", "COMESTIBLE", ...]

The keys.py output will use parent.child dotted notation for objects nested within one another. For example, the “name” value is often an object including a pluralized form, and items with “pocket_data” typically contain a nested list of objects in their JSON. The dot indicates keys within those objects:

$ tools/json_tools/keys.py type=ARMOR | tools/json_tools/lister.py

{ ..., "pocket_data.max_contains_volume", "pocket_data.max_item_length", "pocket_data.pocket_type", ... }

These dotted keys can be passed as the -k or --key argument of values.py, to inspect values within those nested objects or lists of objects in the JSON data. For example, to look at the values of “max_item_length” within the “pocket_data” objects of ARMOR types:

$ tools/json_tools/values.py -k pocket_data.max_item_length type=ARMOR

{ "25 cm": 1, "140 cm": 1, "16 cm": 1, "50 cm": 5, "MISSING": 785, ... }

Examples and use cases

Desired keys Command-line
of material types keys.py type=material
of overmap_special types keys.py type=overmap_special
of weapons category keys.py category=weapons
of weapons with wood material keys.py category=weapons material=wood
Desired info Command-line
All type values in all JSON data values.py -k type
All category values in all JSON data values.py -k category
IDs of items with material including kevlar values.py -k id material=kevlar
IDs of all MAGAZINE types values.py -k id type=MAGAZINE
Materials of all GUN items values.py -k material type=GUN
Materials of all TOOL items values.py -k material type=TOOL
Encumbrances of ARMOR made of leather values.py -k encumbrance type=ARMOR material=leather
All mutation type category values values.py -k category type=mutation
Addiction types of COMESTIBLE items values.py -k addiction_type type=COMESTIBLE
Valid targets of SPELL types values.py -k valid_targets type=SPELL
Monster conditions in monstergroup types values.py -k monsters.conditions type=monstergroup