1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
Metadata-Version: 2.4
Name: condense-json
Version: 0.1.3
Summary: Python function for condensing JSON using replacement strings
Author: Simon Willison
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/simonw/condense-json
Project-URL: Changelog, https://github.com/simonw/condense-json/releases
Project-URL: Issues, https://github.com/simonw/condense-json/issues
Project-URL: CI, https://github.com/simonw/condense-json/actions
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: mypy; extra == "test"
Dynamic: license-file
# condense-json
[](https://pypi.org/project/condense-json/)
[](https://github.com/simonw/condense-json/actions/workflows/test.yml)
[](https://github.com/simonw/condense-json/releases)
[](https://github.com/simonw/condense-json/blob/main/LICENSE)
Python function for condensing JSON using replacement strings
## Installation
Install this library using `pip`:
```bash
pip install condense-json
```
## Usage
The `condense_json` function searches a JSON-like object for strings that contain specified replacement substrings. It replaces these substrings with a compact representation, making the JSON more concise. The `uncondense_json` function reverses this process.
**`condense_json(obj: Dict, replacements: Dict[str, str]) -> Any`**
* **`obj`**: The JSON-like object (nested dictionaries, lists, and strings) to condense.
* **`replacements`**: A dictionary where keys are replacement IDs (e.g., "1", "2") and values are the strings they represent.
The function returns a modified version of the input `obj` where matching substrings are replaced. If a string consists *entirely* of a replacement string, it's replaced with `{"$": replacement_id}`. If a string contains one or more replacement strings, it's replaced with `{"$r": [ ...segments...]}` where segments are the parts of the original string and replacement IDs.
**Example:**
```python
from condense_json import condense_json
input_json = {
"foo": {
"bar": {
"string": "This is a string with foxes in it",
"nested": {
"more": ["Here is a string", "another with foxes in it too"]
},
}
}
}
replacements = {"1": "with foxes in it"}
condensed_output = condense_json(input_json, replacements)
print(condensed_output)
# Expected output:
# {
# "foo": {
# "bar": {
# "string": {"$r": ["This is a string ", {"$": "1"}]},
# "nested": {
# "more": [
# "Here is a string",
# {"$r": ["another ", {"$": "1"}, " too"]}
# ]
# }
# }
# }
# }
```
**`uncondense_json(obj: Dict, replacements: Dict[str, str]) -> Any`**
* **`obj`**: The condensed JSON-like object.
* **`replacements`**: The same `replacements` dictionary used for condensing.
This function reverses the `condense_json` operation. It finds the `{"$": replacement_id}` and `{"$r": [ ...segments...]}` structures and replaces them with the original strings from the `replacements` dictionary.
**Example:**
```python
from condense_json import uncondense_json, condense_json # Import both
original = {
"sentence": "The quick brown fox jumps over the lazy dog",
"nested": {"list": ["fast fox", "lazy dog", "just some text"]},
}
replacements = {"1": "quick brown fox", "2": "lazy dog"}
condensed = condense_json(original, replacements)
uncondensed = uncondense_json(condensed, replacements)
assert uncondensed == original
```
If the input `obj` to `uncondense_json` doesn't contain any condensed structures, it returns the input unchanged.
## Development
To contribute to this library, first checkout the code. Then create a new virtual environment:
```bash
cd condense-json
python -m venv venv
source venv/bin/activate
```
Now install the dependencies and test dependencies:
```bash
python -m pip install -e '.[test]'
```
To run the tests:
```bash
python -m pytest
```
|