-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path11_json_patch.mojo
More file actions
176 lines (140 loc) · 6.04 KB
/
11_json_patch.mojo
File metadata and controls
176 lines (140 loc) · 6.04 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# Example 11: JSON Patch (RFC 6902) and Merge Patch (RFC 7396)
#
# JSON Patch: Apply a sequence of operations to modify JSON documents.
# Merge Patch: Simpler patching by merging objects (null removes keys).
from mojson import loads, dumps, apply_patch, merge_patch, create_merge_patch
fn main() raises:
print("JSON Patch Examples")
print("=" * 50)
print()
# ==========================================================
# 1. JSON Patch - Add operation
# ==========================================================
print("1. JSON Patch - Add:")
var doc = loads('{"name": "Alice"}')
var patch = loads('[{"op": "add", "path": "/age", "value": 30}]')
var result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Patch: add /age = 30")
print(" Result:", dumps(result))
print()
# ==========================================================
# 2. JSON Patch - Remove operation
# ==========================================================
print("2. JSON Patch - Remove:")
doc = loads('{"name": "Alice", "age": 30, "temp": "delete me"}')
patch = loads('[{"op": "remove", "path": "/temp"}]')
result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Patch: remove /temp")
print(" Result:", dumps(result))
print()
# ==========================================================
# 3. JSON Patch - Replace operation
# ==========================================================
print("3. JSON Patch - Replace:")
doc = loads('{"name": "Alice", "status": "pending"}')
patch = loads('[{"op": "replace", "path": "/status", "value": "active"}]')
result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Patch: replace /status = 'active'")
print(" Result:", dumps(result))
print()
# ==========================================================
# 4. JSON Patch - Move operation
# ==========================================================
print("4. JSON Patch - Move:")
doc = loads('{"old_name": "value", "other": "data"}')
patch = loads('[{"op": "move", "from": "/old_name", "path": "/new_name"}]')
result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Patch: move /old_name -> /new_name")
print(" Result:", dumps(result))
print()
# ==========================================================
# 5. JSON Patch - Copy operation
# ==========================================================
print("5. JSON Patch - Copy:")
doc = loads('{"source": "original value"}')
patch = loads('[{"op": "copy", "from": "/source", "path": "/destination"}]')
result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Patch: copy /source -> /destination")
print(" Result:", dumps(result))
print()
# ==========================================================
# 6. JSON Patch - Test operation
# ==========================================================
print("6. JSON Patch - Test (validates before applying):")
doc = loads('{"version": 1, "data": "important"}')
# This patch only applies if version == 1
patch = loads('''[
{"op": "test", "path": "/version", "value": 1},
{"op": "replace", "path": "/version", "value": 2}
]''')
result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Patch: test version==1, then replace to 2")
print(" Result:", dumps(result))
print()
# ==========================================================
# 7. Multiple operations
# ==========================================================
print("7. Multiple operations:")
doc = loads('{"user": {"name": "Alice", "role": "user"}}')
patch = loads('''[
{"op": "replace", "path": "/user/role", "value": "admin"},
{"op": "add", "path": "/user/permissions", "value": ["read", "write"]},
{"op": "add", "path": "/updated", "value": true}
]''')
result = apply_patch(doc, patch)
print(" Original:", dumps(doc))
print(" Result:", dumps(result, indent=" "))
print()
# ==========================================================
# 8. Merge Patch (RFC 7396) - simpler alternative
# ==========================================================
print("8. Merge Patch (simpler):")
var target = loads('{"name": "Alice", "age": 30, "city": "NYC"}')
var merge = loads('{"age": 31, "city": null, "country": "USA"}')
result = merge_patch(target, merge)
print(" Target:", dumps(target))
print(" Merge:", dumps(merge))
print(" Result:", dumps(result))
print(" Note: null removes 'city', updates 'age', adds 'country'")
print()
# ==========================================================
# 9. Create Merge Patch (diff two documents)
# ==========================================================
print("9. Create Merge Patch (diff):")
var before = loads('{"name": "Alice", "age": 30}')
var after = loads('{"name": "Alice", "age": 31, "active": true}')
var diff = create_merge_patch(before, after)
print(" Before:", dumps(before))
print(" After:", dumps(after))
print(" Diff patch:", dumps(diff))
print()
# ==========================================================
# 10. Practical example - API update
# ==========================================================
print("10. Practical example - partial update:")
var user = loads('''
{
"id": 123,
"name": "Alice",
"email": "alice@old.com",
"settings": {"theme": "light", "notifications": true}
}
''')
# Client sends partial update
var update = loads('''
{
"email": "alice@new.com",
"settings": {"theme": "dark"}
}
''')
var updated = merge_patch(user, update)
print(" Updated user:")
print(dumps(updated, indent=" "))
print()
print("Done!")