Robove-json 패키지는 Python에서 JSON 파일 및 객체 작업을 위한 가볍지만 유능한 라이브러리입니다.
PyPI에서 직접 이 패키지를 설치할 수 있습니다.
pip install robust-json
이 라이브러리는 Python 3.x에서만 지원됩니다.
이 프로젝트를 개선하고 싶다면 먼저 새 이슈를 열어 아이디어를 논의하세요. 그런 다음 이 저장소를 포크하고 이 멋진 기능을 구현하거나 이 성가신 버그를 수정하세요. 그런 다음 새 PR을 생성하고 승인을 기다립니다.
참고: Contribution.md 파일을 먼저 읽어보세요. 여기에서 행동 강령과 기여 과정에 관한 유용한 정보를 찾을 수 있습니다.
이 라이브러리에는 4개의 모듈이 포함되어 있습니다.
이 모듈은 JsonFileParser 클래스를 통해 JSON 파일 작업을 위한 다양한 방법을 제공합니다. 지정된 파일에서 유효한 JSON을 자동으로 구문 분석하고 로드하며 파일이 처리할 준비가 되었는지도 확인합니다. 액세스하려면 파일 모듈에서 JsonFileParser를 가져오면 됩니다.
from robust_json.file import JsonFileParser
초기화합니다.
op = JsonFileParser(path_to_json_file)
참고: JsonFileParser는 이제 자동 저장을 지원합니다. 활성화되면 모듈은 모든 변경 후 활성 개체를 저장하고 지정된 파일에 씁니다.
자동 저장을 활성화하려면 autosave
매개변수를 True
로 설정하여 이 모듈을 초기화하기만 하면 됩니다.
op = JsonFileParser(path_to_json_file, autosave=True)
참고: 자동 저장을 위한 파일을 지정할 수도 있습니다. 다음과 같이 초기화 중에 파일 경로와 함께 autosave_path
매개변수를 전달하면 됩니다.
op = JsonFileParser(path*to_json_file, autosave=True, autosave_path=path_to_autosave_file)
파일이 존재하지 않으면 모듈이 파일을 생성합니다. 파일이 존재하는 경우 해당 파일은 잘리고 직렬화된 활성 개체로 채워집니다.
초기화 중에 JSONFileError 예외가 발생할 수 있습니다. 이는 파서가 지정된 파일의 내용을 처리할 수 없거나 파일에 지원되지 않는 확장자가 있음을 의미합니다. 또한 이 단계 중에 지정된 파일이 존재하지 않는다는 표시로 FileNotFoundError 가 발생할 수 있습니다. 하나 이상의 매개변수 유형이 잘못된 경우 IncorlectFunctionParameterTypeError 예외가 발생합니다.
속성 :
JsonFileParser.file_formats 이 속성은 이 모듈에서 지원하는 모든 파일 확장자를 배열 형식으로 나열합니다. 현재는 .json 및 .txt 파일만 지원됩니다. 이는 클래스 초기화 중에 파일을 처리할 수 있는지 확인하는 데 사용됩니다.
JsonFileParser.path 이 속성은 소스 파일 경로를 반환합니다.
JsonFileParser.active_json 이 속성은 최근 변경 사항이 모두 포함된 JSON 개체를 반환합니다.
JsonFileParser.backup 이 속성은 모든 최근 변경 사항을 무시하고 초기 JSON 개체를 반환합니다. 마지막 두 속성은 혼란스러울 수 있으므로 다음은 예입니다( 참고: JsonFileParser.append() 함수에 대한 해당 설명서 섹션 참조 ).
from robust_json.file import JsonFileParser
op = JsonFileParser('test1.json') #Class initialization
# Contents of 'test1.json' file: {'test_key': 'test_value'}
op.append('$', {'append_key': 'append_value'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'append_key': 'append_value'}
print(op.backup)
# Output: {'test_key': 'test_value'}
# As you can see, JsonFileParser.backup property is equal to initial contents of 'test1.json' file.
# This is useful when there is a need to discard all changes to JSON object.
방법 :
JsonFileParser.get_json_from_file() 이 메서드는 파일에서 모든 JSON을 검색하여 Python 사전으로 반환합니다. 지정된 파일이 처음 처리될 때 자동으로 호출됩니다.
from robust_json.file import JsonFileParser
op = JsonFileParser('test1.json') # JsonFileParser.get_json_from_file() function is called here
JsonFileParser.get_key_value(json_path: str) 이 메소드는 JSON 객체의 특정 키:값 쌍에 있는 값에 액세스하여 이를 반환합니다. json_path:str 매개변수는 키:값 쌍의 경로를 지정합니다(예: field0.field1.[...].fieldn). 예:
from robust_json.file import JsonFileParser
op = JsonFileParser('test2.json')
# Contents of 'test2.json' file: {'test_key': 'test_value', 'test_arr': [1, 2, 3]}
val = op.get_key_value('test_key')
print(val)
# Output: 'test_value'
# You can use this method to retrieve an element from JSON array
val = op.get_key_value('test_arr[1]')
print(val)
# Output: 2
이 함수는 해당 매개변수의 유형이 잘못된 경우 IncorlectFunctionParameterTypeError 를 발생시킵니다. 이 함수는 지정된 JSON 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) JSONPathError를 발생시킵니다.
JsonFileParser.append(json_path: str,append_value:any,append_at_end:bool = False) 이 메서드는 기존 JSON 개체에 값을 추가하고 업데이트된 내용이 포함된 Python 사전을 반환합니다. json_path:str 매개변수는 새 값이 추가될 경로를 지정합니다. JSON 객체의 루트에 값을 추가하려면 json_path가 '$'와 같아야 합니다. append_value:any 매개변수는 추가될 값을 지정합니다. append_at_end:bool 은 객체의 JSON 배열(예: [{}, {}, {}, ...]과 같은 구조) 및 일반 배열(예: [a, b, c, . ..]). 다른 구조에는 영향을 미치지 않습니다. False로 설정하면 함수는 배열의 각 개체에 지정된 값을 추가하려고 시도합니다. True로 설정하면 함수는 배열 끝에 주어진 값을 추가하려고 시도합니다. (아래 예 참조). 이 함수는 업데이트된 JSON이 포함된 Python 사전을 반환합니다.
이 함수는 해당 매개변수(-s)에 잘못된 유형이 있는 경우(-ve) IncorlectFunctionParameterTypeEroor 예외를 발생시킵니다. 또한 이 함수는 'append value'가 비어 있는 경우(빈 문자열, 빈 배열, 빈 사전 등과 같음) ValueError 예외를 발생시킵니다. 이 함수는 제공된 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) _JSONPathError를 발생시킵니다 . 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
객체의 루트에 간단한 키:값 쌍 추가
from robust_json.file import JsonFileParser
op = JsonFileParser('test3.json')
# Contents of 'test3.json' file: {'test_key': 'test_value'}
op.append('$', {'add_key': 'add_var'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'add_key': 'add_var'}
객체 배열에 새 객체 추가
from robust_json.file import JsonFileParser
op = JsonFileParser('users.json')
# Contents of 'users.json' file: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op.append('users', {'id': 3, 'name': 'Liza'})
print(op.active_json)
# Output: {'users': [{'id': 3, 'name': 'Lisa'}, {'id': 3, 'name': 'Lisa'}]}
# This is not good!
# This happened because 'append_at_end' parameter is set to False.
# Function appended new object to each of the objects in the array and new values have overwritten the old
# ones.
# Note: we can discard these unwanted/malicious changes using JsonFileParser.reset() function with
# its parameter set to True. (please refer to corresponding section in docs)
op.reset(True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
# We need to set 'append_at_end' parameter to True to avoid this.
op.append('users', {'id': 3, 'name': 'Liza'}, True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}, {'id': 3, 'name': 'Lisa'}]}
배열의 각 객체에 키:값 쌍 추가
from robust_json.file import JsonFileParser
op = JsonFileParser('users.json')
# Contents of 'users.json' file: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op.append('users', {'role': 'guest'})
print(op.active_json)
# Output: {'users':[{'id':1, 'name':'Ken', 'role':'guest'}, {'id':2, 'name':'Alec', 'role':'guest'}]}
요소 배열에 새 요소 추가:
from robust_json.file import JsonFileParser
op = JsonFileParser('test4.json')
# Contents of 'test4.json' file: {'colors': ['cyan', 'magenta']}
op.append('colors', 'yellow')
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta']}
# Nothing happened.
# That's because 'append_at_end' parameter is set to False.
# Function tried to append new string to each string and failed.
# To fix this, we need to set 'append_at_end' parameter to True.
op.append('colors', 'yellow', True)
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta', 'yellow']}
JsonFileParser.update_value(json_path: str, key_or_index: Union[str, int], new_value: any, strict_mode: bool = False)
이 함수는 키:값 쌍의 값을 업데이트하고 업데이트된 내용이 포함된 Python 사전을 반환합니다. json_path:str 매개변수는 키:값 쌍/배열/등에 대한 경로를 지정합니다. 업데이트해야 하는 상위 항목입니다. (JSON 개체의 루트 값을 업데이트하려면 json_path 가 '$'와 같아야 함) key_or_index:Union[str, int] 매개 변수는 키(객체인 경우) 또는 배열 인덱스(배열인 경우)를 지정합니다. 이는 'field0.field1.upd key' 경로로 키를 업데이트해야 하는 경우 _json_path가 'field0.field1'과 같고 key_or_index 매개변수가 'upd key'와 동일하다는 것을 의미합니다. _참고: 'json_path' 매개변수가 JSON 객체를 가리키는 동안 배열 인덱스를 사용하거나 'json_path'가 JSON 배열을 가리키는 동안 속성 이름을 사용하는 경우 예외가 발생합니다 (아래 예 참조). new_value:any는 이전 값을 덮어쓸 값을 지정하고 strict_mode:bool은 Strict 모드를 활성화합니다. 기본적으로 이 모드는 꺼져 있습니다. 켜져 있으면 이 메서드는 새 값이 이전 값과 동일한 유형인지 확인합니다(이전 값이 문자열인 경우 새 값도 문자열이어야 합니다. 등). 유형이 일치하지 않으면 예외가 발생합니다.
이 함수는 매개변수(-s)에 잘못된 유형이 있는 경우 IncorlectFunctionParameterTypeError 예외를 발생시킵니다. 또한 이 함수는 엄격 모드가 활성화된 경우 일치하지 않는 유형의 경우 JSONStrictModeError 를 발생시키고, JSON 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) JSONPathError 예외를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
객체 루트의 키:값 쌍 업데이트:
from robust_json.file import JsonFileParser
op = JsonFileParser('test5.json')
# Contents of 'test5.json' file: {'app_name': 'HomeCare', 'version', '1.0.0'}
op.update_value('$', 'version': '1.0.5')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'version': '1.0.5'}
배열의 항목 업데이트:
from robust_json.file import JsonFileParser
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.update_value('authors', 1, 'Nick Rogerson')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogerson']}
# Note: if you don't know the index of an item, you can use
# 'get_item_index()' function from 'robust_json.ext' module to get it.
# (See corresponding section in the docs)
from robust_json.file import JsonFileParser
import robust_json.ext as ext
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']}
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.update_value('authors', index, 'Alain Hammer')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alain Hammer', 'Nick Rogers']}
엄격 모드로 값 업데이트:
from robust_json.file import JsonFileParser
op = JsonFileParser('test6.json')
# Contents of 'test6.json' file: {'app_name': 'HomeCare', 'app_id': 1077}
op.update_value('$', 'app_id', 'this is a string', True)
# A 'StrictModeError' exception was raised.
# This happened because new value has a different type.
# Let's try again, but with integer.
op.update_value('$', 'app_id', 1080, True)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'app_id': 1080}
JsonFileParser.delete(json_path: str, key_or_index: Union[str, int]) 이 함수는 JSON에서 요소를 삭제하고 업데이트된 내용이 포함된 Python 사전을 반환합니다. json_path:str 매개변수는 키:값 쌍/배열/등에 대한 경로를 지정합니다. 삭제해야 할 상위 항목입니다. (JSON 객체의 루트에 있는 값을 삭제하려면 json_path 가 '$'와 같아야 함) key_or_index:Union[str, int] 매개 변수는 키(객체인 경우) 또는 배열 인덱스(배열인 경우)를 지정합니다. 이는 'field0.field1.del key' 경로가 있는 키를 삭제해야 하는 경우 _json_path가 'field0.field1'과 같고 key_or_index 매개변수가 'del key'와 동일하다는 것을 의미합니다. _참고: 'json_path' 매개변수가 JSON 객체를 가리키는 동안 배열 인덱스를 사용하거나 'json_path'가 JSON 배열을 가리키는 동안 속성 이름을 사용하는 경우 예외가 발생합니다 (아래 예 참조). 이 함수는 해당 매개변수(-s)에 잘못된 유형이 있는 경우 IncorlectFunctionParameterTypeError 예외를 발생시킵니다. 이 함수는 JSON 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) JSONPathError 예외를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
객체 루트에서 키:값 쌍 삭제:
from robust_json.file import JsonFileParser
op = JsonFileParser('test7.json')
# Contents of 'test5.json' file: {'test_key': 'test_val', 'del_key': 'del_val'}
op.delete('$', 'del_key')
print(op.active_json)
# Output: {'test_key': 'test_val'}
배열에서 항목 삭제:
from robust_json.file import JsonFileParser
op = JsonFileParser('test8.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.delete('authors', 1)
print(op.active_json)
# Output: {'app_name': 'PetShopify', 'authors': ['Alec Hammer']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.file import JsonFileParser
import robust_json.ext as ext
op = JsonFileParser('test9.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.delete('authors', index)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Nick Rogers']}
JsonFileParser.minify() 이 함수는 JSON 파일의 모든 들여쓰기를 제거합니다. 기본적으로 모든 JSON을 한 줄로 압축합니다.
이 함수는 어떤 값도 반환하지 않습니다.
JsonFileParser.prettiify(indent: int = 4) 이 함수는 가독성을 높이기 위해 소스 파일의 JSON에 들여쓰기를 추가합니다. indent:int 매개변수는 공백 수를 지정합니다. 기본적으로 4와 같습니다. 이 함수는 JsonFileParser.minify() 와 완전히 반대입니다.
이 함수는 어떤 값도 반환하지 않습니다.
이 함수는 해당 매개변수의 유형이 잘못된 경우 IncorlectFunctionParameterTypeError 를 발생시킵니다.
JsonFileParser.reset(discard_active_object: bool = False) 이 함수는 활성 JSON 개체를 재설정하여 해당 개체에 대한 모든 변경 사항을 제거합니다. Discard_active_object:bool 매개변수는 활성 JSON 객체(JsonFileParser.active_json 속성)와 관련된 이 함수의 동작을 제어합니다. False로 설정하면 이 메서드는 단순히 초기 개체를 반환하고 활성 JSON에 대한 모든 변경 사항을 유지합니다. True로 설정하면 이 함수는 초기 개체를 반환하지만 활성 개체도 재설정하고 모든 변경 사항이 영원히 사라집니다.
이 함수는 해당 매개변수의 유형이 잘못된 경우 IncorlectFunctionParameterTypeError 를 발생시킵니다.
예:
초기 객체를 가져와 변수에 저장합니다.
from robust_json.file import JsonFileParser
op = JsonFileParser('test10.json')
# Contents of `test10.json` file: { "simple_key": "simple_value" }
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other.
initial = op.reset()
print(initial)
# initial = { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value", "test_arr": [1, 2, 3] }
# Calling this method without parameters simply makes it return initial
# object, saving the active one for future use.
초기 개체 가져오기 및 활성 개체 재설정:
from robust_json.file import JsonFileParser
op = JsonFileParser('test10.json')
# Contents of `test10.json` file: { "simple_key": "simple_value" }
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other.
initial = op.reset(True)
print(initial)
# Output: { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value" }
# Calling this method with 'discard_active_object' set to True.
# makes it completely revert all changes to active object, making it
# equal to the initial one.
# Warning!
# Note: if called with 'discard_active_object' set to True, there
# is no way of going back. All changes will be gone for good.
# Please use this with extreme caution!
JsonFileParser.save_to_file(path: str = None, prettify: bool = True, create_file: bool = False) 이 함수는 활성 JSON 개체를 파일에 저장합니다. path:str 매개변수는 파일 경로를 지정합니다. 비워두면 활성 개체가 소스 파일에 저장됩니다. prettify:bool 매개변수는 들여쓰기를 활성화합니다. 기본적으로 True로 설정되어 있습니다. False로 설정하면 JSON이 한 줄로 압축됩니다. create_file:bool 매개변수는 파일 생성을 활성화합니다. True로 설정하면 이 함수는 새 파일을 생성하고 활성 개체를 거기에 저장하지만, 경로 매개변수가 존재하지 않는 파일을 가리키는 경우에만 해당됩니다. 참고: create_file이 True로 설정되고 경로가 기존 파일을 가리키는 경우 예외가 발생합니다.
이 함수는 최종 파일이 JSON을 지원하지 않는 경우(지원되지 않는 확장자가 있는 경우) JSONFileError를 발생시킵니다. create_file이 True로 설정되어 있고 지정된 경로에 파일이 이미 존재하는 경우 이 함수는 FileExistsError 를 발생시킵니다. create_file이 False로 설정되어 있고 지정된 경로에서 파일을 찾을 수 없는 경우 이 함수는 FileNotFoundError 를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
활성 개체를 소스 파일에 저장:
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file()
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling 'save_to_file' method without any arguments makes it
# overwrite an object in source file ('data.json' in this case)
# with the value of JsonFileParser.active_json property.
활성 개체를 다른 파일(기존)에 저장하는 중:
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling this function with different 'path' parameter will
# make this function save the value of JsonFileParser.active_json property into
# existing file ('new_data.json' in this case). But if file cannot be found, a 'FileNotFoundError'
# exception will be raised.
활성 개체를 다른 파일(존재하지 않음)에 저장하는 중:
from robust_json.file import JsonFileParser
op = JsonFileParser('data.json')
# Contents of 'data.json' file: {'name': 'Helen Anderson', 'employee_id': 107756}
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# A 'FileNotFoundError' exception has been raised.
# It happened because this file does not exist.
# To fix this we need to set 'create_file' parameter to True.
op.save_to_file(path='new_data.json', create_file=True)
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling the function with 'create_file' set to True and different path makes it create
# a new file and save the value of JsonFileParser.active_json property there.
# But if file already exists, a 'FileExistsError' will be raised.
이 모듈은 JsonObjectParser 클래스를 통해 JSON 객체를 직접 작업할 수 있는 다양한 방법을 제공합니다. 이 클래스는 API 호출에서 수신된 JSON과 함께 작동하거나 API에서 사용되도록 특별히 설계되었습니다. 액세스하려면 파일 모듈에서 JsonObjectParser를 가져오면 됩니다.
from robust_json.object import JsonObjectParser
초기화합니다.
op = JsonObjectParser(json_obj)
참고: JsonObjectParser는 이제 자동 저장을 지원합니다. 활성화되면 모듈은 모든 변경 후 활성 개체를 저장하고 지정된 파일에 씁니다.
자동 저장을 활성화하려면 autosave
매개변수를 True
로 설정하여 이 모듈을 초기화하기만 하면 됩니다.
op = JsonObjectParser(json_object, autosave=True)
참고: 자동 저장을 위한 파일을 지정할 수도 있습니다. 다음과 같이 초기화 중에 파일 경로와 함께 autosave_path
매개변수를 전달하면 됩니다.
op = JsonObjectParser(json_object, autosave=True, autosave_path=path_to_autosave_file)
파일이 존재하지 않으면 모듈이 파일을 생성합니다. 파일이 존재하는 경우 해당 파일은 잘리고 직렬화된 활성 개체로 채워집니다.
초기화 중에 IncorlectFunctionParameterTypeError 예외가 발생할 수 있습니다. 이는 json 매개변수의 유형이 잘못되었음을 의미합니다.
속성 :
JsonObjectParser.active_json 이 속성은 최근 변경 사항이 모두 포함된 JSON 개체를 반환합니다.
JsonObjectParser.backup 이 속성은 모든 최근 변경 사항을 무시하고 초기 JSON 개체를 반환합니다. 마지막 두 속성은 혼란스러울 수 있으므로 다음은 예입니다( 참고: JsonObjectParser.append() 함수에 대한 해당 설명서 섹션 참조 ).
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value'}
op = JsonObjectParser(obj) #Class initialization
op.append('$', {'append_key': 'append_value'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'append_key': 'append_value'}
print(op.backup)
# Output: {'test_key': 'test_value'}
# As you can see, JsonObjectParser.backup property is equal to initial object.
# This is useful when there is a need to discard all changes to JSON object.
방법 :
JsonObjectParser.get_key_value(json_path: str) 이 메소드는 JSON 객체의 특정 키:값 쌍에 있는 값에 액세스하여 이를 반환합니다. json_path:str 매개변수는 키:값 쌍의 경로를 지정합니다(예: field0.field1.[...].fieldn). 예:
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value', 'test_arr': [1, 2, 3]}
op = JsonObjectParser(obj)
val = op.get_key_value('test_key')
print(val)
# Output: 'test_value'
# You can use this method to retrieve an element from JSON array
val = op.get_key_value('test_arr[1]')
print(val)
# Output: 2
이 함수는 해당 매개변수의 유형이 올바르지 않으면 IncorlectFunctionParameterTypeError 를 발생시킵니다. 이 함수는 지정된 JSON 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) JSONPathError를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
JsonObjectParser.append(json_path: str,append_value:any,append_at_end:bool = False) 이 메서드는 기존 JSON 개체에 값을 추가하고 업데이트된 내용이 포함된 Python 사전을 반환합니다. json_path:str 매개변수는 새 값이 추가될 경로를 지정합니다. JSON 객체의 루트에 값을 추가하려면 json_path가 '$'와 같아야 합니다. append_value:any 매개변수는 추가될 값을 지정합니다. append_at_end:bool 은 객체의 JSON 배열(예: [{}, {}, {}, ...]과 같은 구조) 및 일반 배열(예: [a, b, c, . ..]). 다른 구조에는 영향을 미치지 않습니다. False로 설정하면 함수는 배열의 각 개체에 지정된 값을 추가하려고 시도합니다. True로 설정하면 함수는 배열 끝에 주어진 값을 추가하려고 시도합니다. (아래 예 참조). 이 함수는 업데이트된 JSON이 포함된 Python 사전을 반환합니다.
이 함수는 해당 매개변수(-s)에 잘못된 유형이 있는 경우(-ve) IncorlectFunctionParameterTypeEroor 예외를 발생시킵니다. 이 함수는 ' 값 추가'가 비어 있는 경우(빈 문자열, 빈 배열, 빈 사전) 에도 ValueError 예외를 발생시킵니다. 이 함수는 제공된 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) _JSONPathError를 발생시킵니다 . 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
객체의 루트에 간단한 키:값 쌍 추가
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_value'}
op = JsonObjectParser(obj)
op.append('$', {'add_key': 'add_var'})
print(op.active_json)
# Output: {'test_key': 'test_value', 'add_key': 'add_var'}
객체 배열에 새 객체 추가
from robust_json.object import JsonObjectParser
obj = {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op = JsonObjectParser(obj)
op.append('users', {'id': 3, 'name': 'Liza'})
print(op.active_json)
# Output: {'users': [{'id': 3, 'name': 'Lisa'}, {'id': 3, 'name': 'Lisa'}]}
# This is not good!
# This happened because 'append_at_end' parameter is set to False.
# Function appended new object to each of the objects in the array and new values overwrote the old
# ones.
# Note: we can discard these unwanted/malicious changes using JsonObjectParser.reset() function with
# its parameter set to True. (please refer to corresponding section in docs)
op.reset(True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
# We need to set 'append_at_end' parameter to True to avoid this.
op.append('users', {'id': 3, 'name': 'Liza'}, True)
print(op.active_json)
# Output: {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}, {'id': 3, 'name': 'Lisa'}]}
배열의 각 객체에 키:값 쌍 추가
from robust_json.object import JsonObjectParser
obj = {'users': [{'id': 1, 'name': 'Ken'}, {'id': 2, 'name': 'Alec'}]}
op = JsonObjectParser(obj)
op.append('users', {'role': 'guest'})
print(op.active_json)
# Output: {'users':[{'id':1, 'name':'Ken', 'role':'guest'}, {'id':2, 'name':'Alec', 'role':'guest'}]}
요소 배열에 새 요소 추가:
from robust_json.object import JsonObjectParser
obj = {'colors': ['cyan', 'magenta']}
op = JsonObjectParser(obj)
op.append('colors', 'yellow')
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta']}
# Nothing happened
# That's because 'append_at_end' parameter is set to False
# Function tried to append new string to each string and failed
# To fix this, we need to set 'append_at_end' parameter to True
op.append('colors', 'yellow', True)
print(op.active_json)
# Output: {'colors': ['cyan', 'magenta', 'yellow']}
JsonObjectParser.update_value(json_path: str, key_or_index: Union[str, int], new_value: any, strict_mode: bool = False)
이 함수는 키:값 쌍의 값을 업데이트하고 업데이트된 내용이 포함된 Python 사전을 반환합니다. json_path:str 매개변수는 키:값 쌍/배열/등에 대한 경로를 지정합니다. 업데이트해야 하는 상위 항목입니다. (JSON 개체의 루트 값을 업데이트하려면 json_path 가 '$'와 같아야 함) key_or_index:Union[str, int] 매개 변수는 키(객체인 경우) 또는 배열 인덱스(배열인 경우)를 지정합니다. 이는 'field0.field1.upd key' 경로로 키를 업데이트해야 하는 경우 _json_path가 'field0.field1'과 같고 key_or_index 매개변수가 'upd key'와 동일하다는 것을 의미합니다. _참고: 'json_path' 매개변수가 JSON 객체를 가리키는 동안 배열 인덱스를 사용하거나 'json_path'가 JSON 배열을 가리키는 동안 속성 이름을 사용하는 경우 예외가 발생합니다 (아래 예 참조). new_value:any는 이전 값을 덮어쓸 값을 지정하고 strict_mode:bool은 Strict 모드를 활성화합니다. 기본적으로 이 모드는 꺼져 있습니다. 켜져 있으면 이 메서드는 새 값이 이전 값과 동일한 유형인지 확인합니다(이전 값이 문자열인 경우 새 값도 문자열이어야 합니다. 등). 유형이 일치하지 않으면 예외가 발생합니다.
이 함수는 해당 매개변수(-s)에 잘못된 유형이 있는 경우 IncorlectFunctionParameterTypeError 예외를 발생시킵니다. 또한 이 함수는 엄격 모드가 활성화된 경우 일치하지 않는 유형의 경우 JSONStrictModeError 를 발생시키고, JSON 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) JSONPathError 예외를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
객체 루트의 키:값 쌍 업데이트:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'version', '1.0.0'})
op.update_value('$', 'version': '1.0.5')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'version': '1.0.5'}
배열의 항목 업데이트:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']})
op.update_value('authors', 1, 'Nick Rogerson')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogerson']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.object import JsonObjectParser
import robust_json.ext as ext
op = JsonObjectParser({'app_name': 'HomeCare', 'authors': ['Alec Hammer', 'Nick Rogers']})
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.update_value('authors', index, 'Alain Hammer')
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Alain Hammer', 'Nick Rogers']}
엄격 모드로 값 업데이트:
from robust_json.object import JsonObjectParser
op = JsonObjectParser({'app_name': 'HomeCare', 'app_id': 1077})
op.update_value('$', 'app_id', 'this is a string', True)
# An 'StrictModeError' was raised
# This happened because new value has a different type
# Let's try again, but with integer
op.update_value('$', 'app_id', 1080, True)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'app_id': 1080}
JsonObjectParser.delete(json_path: str, key_or_index: Union[str, int]) 이 함수는 JSON에서 요소를 삭제하고 업데이트된 내용이 포함된 Python 사전을 반환합니다. json_path:str 매개변수는 키:값 쌍/배열/등에 대한 경로를 지정합니다. 삭제해야 할 상위 항목입니다. (JSON 객체의 루트에 있는 값을 삭제하려면 json_path 가 '$'와 같아야 함) key_or_index:Union[str, int] 매개 변수는 키(객체인 경우) 또는 배열 인덱스(배열인 경우)를 지정합니다. 이는 'field0.field1.del key' 경로가 있는 키를 삭제해야 하는 경우 _json_path가 'field0.field1'과 같고 key_or_index 매개변수가 'del key'와 동일하다는 것을 의미합니다. _참고: 'json_path' 매개변수가 JSON 객체를 가리키는 동안 배열 인덱스를 사용하거나 'json_path'가 JSON 배열을 가리키는 동안 속성 이름을 사용하는 경우 예외가 발생합니다 (아래 예 참조). 이 함수는 해당 매개변수(-s)에 잘못된 유형이 있는 경우 IncorlectFunctionParameterTypeError 예외를 발생시킵니다. 이 함수는 JSON 경로가 유효하지 않은 경우(존재하지 않거나 액세스할 수 없는 경우) JSONPathError 예외를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
객체 루트에서 키:값 쌍 삭제:
from robust_json.object import JsonObjectParser
obj = {'test_key': 'test_val', 'del_key': 'del_val'}
op = JsonObjectParser(obj)
op.delete('$', 'del_key')
print(op.active_json)
# Output: {'test_key': 'test_val'}
배열에서 항목 삭제:
from robust_json.object import JsonObjectParser
op = JsonObjectParser('test8.json')
# Contents of 'test6.json' file: {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op.delete('authors', 1)
print(op.active_json)
# Output: {'app_name': 'PetShopify', 'authors': ['Alec Hammer']}
# Note: if you don't know the index of an item, you can use 'get_item_index()'
# function from 'robust_json.ext' module to get it. (See corresponding section in the docs)
from robust_json.object import JsonObjectParser
import robust_json.ext as ext
obj = {'app_name': 'PetShopify', 'authors': ['Alec Hammer', 'Nick Rogers']}
op = JsonObjectParser(obj)
# Getting an array for future use
authors_array = op.get_key_value('authors')
print(authors_array)
# Output: ['Alec Hammer', 'Nick Rogers']
# Finding the index
index = ext.get_item_index('Alec Hammer', authors_array, False)
print(index)
# Output: 0
#Updating value
op.delete('authors', index)
print(op.active_json)
# Output: {'app_name': 'HomeCare', 'authors': ['Nick Rogers']}
JsonObjectParser.reset(discard_active_object: bool = False) 이 함수는 활성 JSON 객체를 재설정하여 해당 객체에 대한 모든 변경 사항을 제거합니다. Discard_active_object:bool 매개변수는 활성 JSON 객체(JsonObjectParser.active_json 속성)와 관련된 이 함수의 동작을 제어합니다. False로 설정하면 이 메서드는 단순히 초기 개체를 반환하고 활성 JSON에 대한 모든 변경 사항을 유지합니다. True로 설정하면 이 함수는 초기 개체를 반환하지만 활성 개체도 재설정하고 모든 변경 사항이 영원히 사라집니다.
이 함수는 해당 매개변수의 유형이 잘못된 경우 IncorlectFunctionParameterTypeError 를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
초기 객체를 가져와 변수에 저장합니다.
from robust_json.object import JsonObjectParser
obj = { "simple_key": "simple_value" }
op = JsonObjectParser(obj)
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other
initial = op.reset()
print(initial)
# initial = { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value", "test_arr": [1, 2, 3] }
# Calling this method without parameters simply makes it return initial
# object, saving the active one for future use
초기 개체 가져오기 및 활성 개체 재설정:
from robust_json.object import JsonObjectParser
obj = { "simple_key": "simple_value" }
op = JsonObjectParser(obj)
op.append('$', { "test_arr": [1, 2, 3] })
# We appended key:value pair to distinguish objects among each other
initial = op.reset(True)
print(initial)
# Output: { "simple_key": "simple_value" }
print(op.active_json)
# Output: { "simple_key": "simple_value" }
# Calling this method with 'discard_active_object' set to True
# makes it completely revert all changes to active object, making it
# equal to the initial one.
# Warning!
# Note: if called with 'discard_active_object' set to True, there
# is no way of going back. All changes will be gone for good.
# Please use this with extreme caution!
JsonObjectParser.save_to_file(path: str, prettify: bool = True, create_file: bool = False) 이 함수는 활성 JSON 개체를 파일에 저장합니다. path:str 매개변수는 파일 경로를 지정합니다. prettify:bool 매개변수는 들여쓰기를 활성화합니다. 기본적으로 True로 설정되어 있습니다. False로 설정하면 JSON이 한 줄로 압축됩니다. create_file:bool 매개변수는 파일 생성을 활성화합니다. True로 설정하면 이 함수는 새 파일을 생성하고 활성 개체를 거기에 저장하지만, 경로 매개변수가 존재하지 않는 파일을 가리키는 경우에만 해당됩니다. 참고: create_file이 True로 설정되고 경로가 기존 파일을 가리키는 경우 예외가 발생합니다.
이 함수는 최종 파일이 JSON을 지원하지 않는 경우(지원되지 않는 확장자가 있는 경우) JSONFileError를 발생시킵니다. 이 함수는 cheate_file이 True로 설정되어 있고 지정된 경로에 파일이 이미 존재하는 경우 FileExistsError 를 발생시킵니다. create_file이 False로 설정되어 있고 지정된 경로에서 파일을 찾을 수 없는 경우 이 함수는 FileNotFoundError 를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
활성 개체를 파일에 저장(기존):
from robust_json.object import JsonObjectParser
obj = {'name': 'Helen Anderson', 'employee_id': 107756}
op = JsonObjectParser(obj)
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling this function with different 'path' parameter will
# make this function save the value of JsonObjectParser.active_json property into
# existing file ('new_data.json' in this case). But if file cannot be found, a 'FileNotFoundError'
# exception will be raised.
활성 개체를 파일에 저장(존재하지 않음):
from robust_json.object import JsonObjectParser
obj = {'name': 'Helen Anderson', 'employee_id': 107756}
op = JsonObjectParser(obj)
op.update_value('$', 'employee_id', 107744)
print(op.active_json)
# Output: {'name': 'Helen Anderson', 'employee_id': 107744}
op.save_to_file(path='new_data.json')
# A 'FileNotFoundError' exception has been raised.
# It happened because this file does not exist.
# To fix this we need to set 'create_file' parameter to True.
op.save_to_file(path='new_data.json', create_file=True)
# Contents of 'new_data.json' file: {'name': 'Helen Anderson', 'employee_id': 107744}
# Calling the function with 'create_file' set to True and different path makes it create
# a new file and save the value of JsonObjectParser.active_json property there.
# But if file already exists, a 'FileExistsError' will be raised.
이 모듈에는 패키지 런타임 중에 발생할 수 있는 모든 사용자 지정 예외가 포함되어 있습니다. 총 5가지가 있습니다: JSONFileError , JSONPathError , JSONStrictModeError , JSONObjectError , IncordirectFunctionParameterTypeError . 이를 가져와야 하는 경우 다음과 같이 수행할 수 있습니다.
import robust_json.errors as json_err
filter_json_array(json_array: list, field: string, value: any) 이 함수는 지정된 JSON 개체 배열을 필터링하여 반환합니다. json_array:list 매개변수는 필터링해야 하는 목록을 지정하고, field:str은 키를 지정하고, value:any는 값을 지정합니다. 두 개의 마지막 매개변수는 필터 역할을 하는 키:값 쌍을 형성합니다.
이 함수는 필터링된 콘텐츠가 포함된 목록을 반환합니다.
이 함수는 하나 이상의 매개변수 유형이 잘못된 경우 IncordirectFunctionParameterTypeError 예외를 발생시킵니다. 이 함수는 json_arr 이 객체 배열([{}, {}, {}, ...])이 아닌 경우 JSONObjectError를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예: 특정 키:값 쌍을 기준으로 객체 배열 필터링
from robust_json.ext import filter_json_array
orders = [{"order_id":1648,"country":"USA" },{"order_id":1830,"country":"Liberia"},
{"order_id":6703,"country":"USA"},{"order_id":2995,"country":"Russia"}]
usa_orders = filter_json_array(orders, 'country', 'USA')
print(usa_orders)
# Output: [{"order_id":1648,"country":"USA" }, {"order_id":6703,"country":"USA"}]
get_item_index(item: any, array: list, Always_array: bool = False) 이 함수는 주어진 배열에서 항목을 찾아 해당 인덱스(-es)를 반환합니다. item:any는 인덱스를 찾아야 하는 항목을 지정합니다. array:list는 이 항목이 있어야 하는 배열을 지정하고 Always_array:bool은 이 함수의 반환 유형을 제어합니다. False로 설정된 경우 이 함수는 일치하는 항목이 여러 개 있는 경우 배열을 반환하지만 일치하는 항목이 하나만 있는 경우 정수를 반환합니다. True로 설정하면 이 함수는 항상 배열을 반환합니다(아래 예 참조).
예:
from robust_json.ext import get_item_index
arr1 = [1, 2, 3, 4]
index = get_item_index(2, arr1, False)
print(index)
# Output: 1
# Note: we set 'always_array' parameter to False, therefore function returned an integer
arr2 = [5, 9, 10, 45, 555]
index = get_item_index(10, arr2, True)
print(index)
# Output: [2]
# Note: we set 'always_array' parameter to True, therefore function returned an array even if there
# is only one match. This is useful when this array will be iterated later on.
arr3 = [1, 6, 'string', 8, 5, 4, 'string', 0, 22]
index = get_item_index('string', arr3, False)
# Note: even if 'alway_array' parameter set to False, this function will return an array of
# integers because there are multiple matches
print(index)
# Output: [2, 6]
arr4 = [1, 2, 3]
index = get_item_index(6, arr4, False)
# Note: if item is not present in the array and 'always_array' parameter set to False,
# None will be returned.
print(index)
# Output: None
arr5 = [5, 6, 7]
index = get_item_index(10, arr5, True)
# Note: if item is not present in the array and 'always_array' parameter set to True,
# an empty array will be returned.
print(index)
# Output: []
reverse_array(array: list) 이 함수는 배열을 반전하여 반환합니다.
이 함수는 해당 매개변수의 유형이 잘못된 경우 IncorlectFunctionParameterTypeError 를 발생시킵니다. 이 함수는 발생하는 경우 추가 예외를 발생시킵니다.
예:
from robust_json.ext import reverse_array
arr = ['a', 'b', 'c']
rev_arr = reverse_array(arr)
print(rev_arr)
# Output: ['c', 'b', 'a']