JSON
https://pynative.com/python-json-exercise/
Json 표준에는 겹따옴표가 표준이고 홑따옴표가 비표준이라는 것
vsCode에서 JSON파일
vscode ~ new file ~ select language : json
~ Shift+Option(alt)+ F ==> json 예쁘게 보기
dictionary -> json 문자열 :: json.dump()
json.dump() vs. json.dumps()
dump() 함수: Python객체를 JSON “파일”에 저장하기
dumps() 함수: Python객체를 JSON “문자열”로 변환
https://www.delftstack.com/ko/howto/python-pandas/json-to-pandas-dataframe/
더블쿼테이션이 표준
{ "1": "one", "2": "둘", "삼": "셋"}
{'1':'one', '2':'둘', '삼':'셋'}
import json # read : 파일 전체 # readline: 한라인데이터 # readlines: 전체데이터를 라인단위로 # data = '{"1":"one", "2":"둘", "삼":"셋"}' # str with open('../app/data/mobi-ex1.json', 'r') as line: data = line.read() s2d = json.loads(data) # {'1': 'one', '2': '둘', '삼': '셋'} # dict d2s = json.dumps(s2d) # '{"1": "one", "2": "\\\\ub458", "\\\\uc0bc": "\\\\uc14b"}' # str d2s_ko = json.dumps(s2d, ensure_ascii=False) # '{"1": "one", "2": "둘", "삼": "셋"}' # data = "{'1':'one', '2':'둘', '삼':'셋'}" # str with open('../app/data/mobi-ex1-single_quote.txt', 'r') as line: data = line.read() s2d = json.loads(data) # JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) s2d = json.loads(data.replace("'", "\\""))
json문자열 -> dictionary :: json.load()
json.load() vs. json.loads()
load() 함수: JSON “파일”을 Python객체로 불러오기
loads() 함수: JSON “문자열”을 Python객체로 변환
json.load()
To parse JSON from URL or file
json.load( fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
fp: file pointer used to read a file,
json.loads()
For parse string with JSON content
into (python)Dictionary
json.loads( s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
file pointer used to read a text file,
에러
AttributeError: ‘str’ object has no attribute ‘loads’
=> json.load()와 json.loads()를 구별못했거나, json이름을 변수로 사용한 경우
json 예제
{"id": 2, "name": ["def", "qwe"]} {"id": 3, "name": ["def", "asd"]} {"id": 4, "name": ["def", "zxc"]} ...
import json basePath = '../app/data/mobi_data' filePath = basePath + '/mobi1/mobility1_01.json' # json_data = open(filePath) # data = json.load(json_data) data = [] with open(filePath) as multiLines: for line in multiLines: data.append(json.loads(line))
read inline json
import json inline_JSON = '{"id":1, "name": ["abc", "xyz"]}' jsonData = json.loads(inline_JSON) #---------------------------------------------------------- len(jsonData) # 2 type(jsonData) # dict jsonData.keys() # dict_keys(['id', 'name']) jsonData.get("name") # ['abc', 'xyz'] json.dumps(jsonData) # '{"id": 1, "name": ["abc", "xyz"]}' print(json.dumps(jsonData, indent='\\t')) # { #\t"id": 1, #\t"name": [ #\t\t"abc", #\t\t"xyz" #\t] #}
read json Files
{ "id": 2, "name": ["def", "qwe"] }
path_JSON = './jsondata/jsn2.json' # String ### Read FilejsonFile = open(path_JSON,'r') #'r'ead,'w'rite,'a'ppend jsonData = json.load(jsonFile) jsonFile.close() ### Read File # with문을 나올 때 close를 자동으로 불러줍니다. with open(path_JSON) as jsonFile: jsonData = json.load(jsonFile)
JSON parse
### JSON (JavaScript Object Notation) # https://docs.python.org/3/library/json.html#json.dumps import json # Read string json_string='{"title": "example", "age": 38, "married": true}' contents = json.loads(json_string) # pretty print(json.dumps(contents, sort_keys=True ,indent=2)) # Load file with open('./text.json') as json_file: contents = json.load(json_file) print(json.dumps(contents, indent=4, ensure_ascii=False)) # Write JSON with open('./data.json', 'w') as json_file: json.dump(json_string, json_file) # parse 1 value val = contents["title"] val = contents.get("title") print(f'value=> {val}') # json to python # object to dictionaries # arrays to lists # Null to None valList = contents.get("house").get("json_array") for val in valList: print(val) valDic = contents.get("house").get("json_object") valDic.keys() valDic.values() for key in valDic: print(key, valDic[key]) for key, val in valDic.items(): print(key, val) for item in valDic.items(): print(item) # search with JMES Path import jmespath jmespath.search("persons[*].age", contents) jmespath.search("house.json_object.name", contents)
{ "title": "json_example", "house" : { "json_string": "string_example", "json_number": 100, "json_array": [1, 2, 3, 4, 5], "json_object": { "name":"John", "age":30}, "json_bool": true }, "house1" : { "json_string": "string_example", "json_number": 100, "json_array": [1, 2, 3, 4, 5], "json_object": { "name":"John", "age":30}, "json_bool": true }, "한글" : "그럴겁니다", "persons": [ { "name": "erik", "age": 38 }, { "name": "john", "age": 45 }, { "name": "rob", "age": 14 } ] }