Pythonic JSON 데이터 처리

PythonBeginner
지금 연습하기

소개

JSON (JavaScript Object Notation) 은 직렬화되고 사람이 읽을 수 있는 형태로 데이터를 저장하기 위한 널리 사용되는 데이터 형식입니다. 서버와 웹 애플리케이션 간에 데이터를 전송하는 데 일반적으로 사용되며, NoSQL 데이터베이스에 데이터를 저장하는 데에도 훌륭한 선택입니다. Python 에서는 json 모듈을 사용하여 JSON 데이터를 처리할 수 있습니다.

성과

  • JSON 파일 읽기 및 쓰기
  • JSON 데이터 직렬화 및 역직렬화

JSON 소개

JSON (JavaScript Object Notation) 은 사람이 읽고 쓰기 쉽고, 기계가 파싱하고 생성하기 쉬운 가벼운 데이터 교환 형식입니다. JavaScript 프로그래밍 언어의 하위 집합인 Standard ECMA-262 3rd Edition - December 1999 를 기반으로 합니다. JSON 은 완전히 언어 독립적인 텍스트 형식이며, C, C++, C#, Java, JavaScript, Perl, Python 등 C 계열 언어 프로그래머에게 익숙한 규칙을 사용합니다. 이러한 특성으로 인해 JSON 은 이상적인 데이터 교환 언어가 됩니다.

JSON 의 기본 구조는 키 - 값 쌍의 모음인 객체 (object) 와 값의 정렬된 목록인 배열 (array) 로 구성됩니다.

다음은 JSON 객체의 예시입니다.

{
  "name": "Alice",
  "age": 26,
  "city": "New York"
}

이 JSON 객체는 세 개의 키 - 값 쌍을 가지고 있습니다.

  • "name" : "Alice"
  • "age" : 26
  • "city" : "New York"

다음은 JSON 배열의 예시입니다.

["apple", "banana", "cherry"]

이 JSON 배열은 "apple", "banana", "cherry"의 세 가지 값을 가지고 있습니다.

JSON 객체는 여러 키 - 값 쌍과 배열을 포함할 수 있으며, JSON 배열은 여러 객체와 배열을 포함할 수 있습니다. 다음은 더 복잡한 JSON 구조의 예시입니다.

{
  "employees": [
    { "firstName": "John", "lastName": "Doe" },
    { "firstName": "Anna", "lastName": "Smith" },
    { "firstName": "Peter", "lastName": "Jones" }
  ],
  "owners": [
    { "name": "Alice", "age": 30 },
    { "name": "Bob", "age": 35 }
  ],
  "office": {
    "name": "Acme Inc.",
    "location": "New York"
  }
}

이 JSON 객체는 세 개의 키 - 값 쌍을 가지고 있습니다.

  • "employees" : 직원 객체의 배열
  • "owners" : 소유자 객체의 배열
  • "office" : 사무실 객체

Json 모듈

Python 에서 JSON 객체를 파싱 (parsing) 하려면 json 모듈을 사용할 수 있습니다. json 모듈은 Python 표준 라이브러리의 일부이므로 별도로 설치할 필요가 없습니다.

새로운 Python 인터프리터 세션을 열고 다음 코드를 입력하십시오.

python3

이전 예제에서 JSON 객체를 파싱하는 방법의 예시는 다음과 같습니다.

import json

json_strings = '{"employees": [{ "firstName": "John", "lastName": "Doe"}, ], "owners": [{ "name": "Alice", "age": 30 }, { "name": "Bob", "age": 35 }], "office": {"name": "Acme Inc."}}'

## Parse the JSON object
data = json.loads(json_strings)

## Access the data
employees = data['employees']
owners = data['owners']
office = data['office']

## Print the data
print(employees)
print(owners)
print(office)

이렇게 하면 다음과 같은 결과가 출력됩니다.

[{'firstName': 'John', 'lastName': 'Doe'}]
[{'name': 'Alice', 'age': 30}, { "name": "Bob", "age": 35 }]
{'name': 'Acme Inc.'}

그런 다음 Python 딕셔너리 (dictionary) 나 리스트 (list) 와 마찬가지로 키와 인덱스를 사용하여 JSON 객체의 데이터에 접근할 수 있습니다. 예를 들어, 첫 번째 직원의 이름을 접근하려면 다음 코드를 사용할 수 있습니다.

first_employee = employees[0]
first_name = first_employee['firstName']
print(first_name)

이렇게 하면 다음과 같은 결과가 출력됩니다.

John

또한 배열을 반복 (loop) 하고 각 요소의 데이터에 접근할 수 있습니다. 예를 들어, 각 소유자의 이름과 나이를 출력하려면 다음 코드를 사용할 수 있습니다.

for owner in owners:
  name = owner['name']
  age = owner['age']
  print(f'{name} is {age} years old.')

이렇게 하면 다음과 같은 결과가 출력됩니다.

Alice is 30 years old.
Bob is 35 years old.

JSON 파일 읽기

JSON 파일을 읽는 것부터 시작해 보겠습니다. 다음과 같은 내용을 담고 있는 employees.json 파일이 있다고 가정해 보겠습니다.

{
  "employees": [
    {
      "firstName": "John",
      "lastName": "Doe"
    },
    {
      "firstName": "Anna",
      "lastName": "Smith"
    },
    {
      "firstName": "Peter",
      "lastName": "Jones"
    }
  ]
}

employees.json/home/labex/project에 존재합니다.

Python 에서 이 파일을 읽으려면 다음 코드를 사용할 수 있습니다.

import json

## Open the file
with open('/home/labex/project/employees.json', 'r') as file:
  ## Load the contents of the file into a variable
  data = json.load(file)

## Print the contents of the file
print(data)

이렇게 하면 다음과 같은 결과가 출력됩니다.

{'employees': [{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]}

Python 딕셔너리 (dictionary) 와 마찬가지로 JSON 객체의 키를 사용하여 파일의 데이터에 접근할 수 있습니다. 예를 들어, 직원 목록에 접근하려면 employees 키를 사용할 수 있습니다.

employees = data['employees']
print(employees)

이렇게 하면 다음과 같은 결과가 출력됩니다.

[{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]

또한 직원 목록을 반복 (loop) 하고 이름을 출력할 수도 있습니다.

for employee in employees:
  print(employee['firstName'], employee['lastName'])

이렇게 하면 다음과 같은 결과가 출력됩니다.

John Doe
Anna Smith
Peter Jones

JSON 파일 쓰기

이제 JSON 파일을 읽는 방법을 알았으니, JSON 파일에 쓰는 방법을 배워보겠습니다. json.dump() 함수를 사용하여 데이터를 JSON 파일에 쓸 수 있습니다.

학생에 대한 정보를 담고 있는 딕셔너리 (dictionary) 목록이 있다고 가정해 보겠습니다. 이 데이터를 students.json이라는 파일에 다음과 같이 쓸 수 있습니다.

import json

## A list of dictionaries
students = [
  { "name": "Alice", "age": 26, "major": "Computer Science" },
  { "name": "Bob", "age": 27, "major": "Economics" },
  { "name": "Charlie", "age": 25, "major": "Physics" }
]

## Open the file
with open('students.json', 'w') as file:
  ## Write the data to the file
  json.dump(students, file)

이제 데이터가 올바르게 쓰여졌는지 확인해 보겠습니다.

with open('students.json', 'r') as file:
  data = json.load(file)
  print(data)

이렇게 하면 다음과 같은 결과가 출력됩니다.

[
  { "name": "Alice", "age": 26, "major": "Computer Science" },
  { "name": "Bob", "age": 27, "major": "Economics" },
  { "name": "Charlie", "age": 25, "major": "Physics" }
]

또한 json.dumps() 함수를 사용하여 Python 객체를 JSON 문자열로 변환한 다음, 파일을 저장하거나 네트워크를 통해 보낼 수 있습니다. 다음은 예시입니다.

## Convert the list of dictionaries to a JSON string
json_string = json.dumps(students)
print(json_string)

## Save the string to a file
with open('students.json', 'w') as file:
  file.write(json_string)

## Now let's verify that the data was written correctly
with open('students.json', 'r') as file:
  data = json.load(file)
  print(data)

이것은 이전 예제와 동일한 출력을 가질 것입니다.

파이썬 객체와 JSON 문자열

Python 객체는 메모리에 저장된 리스트, 딕셔너리 등의 형태로 된 데이터 모음입니다. 반면에 JSON 문자열은 JSON 객체의 직렬화된 표현입니다. JSON 객체의 데이터를 나타내는 문자열이지만, 실제 객체로 메모리에 저장되지는 않습니다.

read() 함수를 사용하여 students.json의 내용을 읽는 방법의 예는 다음과 같습니다.

with open('students.json', 'r') as file:
  json_string = file.read()
  print(json_string)

이렇게 하면 다음과 같은 결과가 출력됩니다.

[{"name": "Alice", "age": 26, "major": "Computer Science"}, {"name": "Bob", "age": 27, "major": "Economics"}, {"name": "Charlie", "age": 25, "major": "Physics"}]

json_string의 첫 번째 요소를 얻으려고 하면 문자열의 첫 번째 문자를 얻게 됩니다.

print(json_string[0])
[

이는 json_string이 리스트 (Python 객체) 가 아닌 문자열이기 때문입니다. 이를 리스트로 변환하려면 json.loads() 함수를 사용할 수 있습니다.

import json

## Convert the JSON string to a Python object
python_object = json.loads(json_string)
print(python_object)

출력은 위와 유사하며, 작은따옴표와 큰따옴표의 차이가 있습니다.

[{'name': 'Alice', 'age': 26, 'major': 'Computer Science'}, {'name': 'Bob', 'age': 27, 'major': 'Economics'}, {'name': 'Charlie', 'age': 25, 'major': 'Physics'}]

이제 리스트의 첫 번째 요소에 접근할 수 있습니다.

print(python_object[0])
{ "name": "Alice", "age": 26, "major": "Computer Science" }

초보자는 종종 Python 객체와 JSON 문자열을 혼동하므로 특별한 주의가 필요합니다.

요약

축하합니다! JSON 파일에 대한 랩을 완료했습니다. Python 에서 JSON 파일을 읽고 쓰는 방법을 배웠습니다. 또한 Python 에서 JSON 데이터를 사용하는 방법도 배웠습니다.