이 글에서는 Android 앱에서 JSONObject 클래스를 활용해 JSON 데이터를 파싱하는 방법을 단계별로 살펴봅니다. org.json 패키지에 기본으로 포함된 JSONObject는 외부 라이브러리 없이도 간단한 JSON 구조를 손쉽게 처리할 수 있어 안드로이드 개발에서 가장 널리 사용되는 방식 중 하나입니다.
1단계 — 새 프로젝트 만들기
Android Studio에서 File ⇒ New Project 메뉴로 이동한 뒤, 새 프로젝트 생성에 필요한 모든 세부 정보를 입력하여 프로젝트를 만듭니다.
2단계 — 레이아웃 XML 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textStyle="bold"
android:textSize="24sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
레이아웃은 화면 중앙에 배치된 하나의 TextView만 포함하는 아주 간단한 구성입니다. 이 TextView는 이후 JSON에서 추출한 직원 정보를 화면에 출력하는 역할을 담당합니다.
3단계 — MainActivity.java 작성
src/MainActivity.java 파일에 다음 코드를 추가합니다.
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
public static final String JSON_STRING="{\"Employee\":{\"Name\":\"Niyaz\",\"Salary\":56000}}";
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
try {
JSONObject emp = (new JSONObject(JSON_STRING)).getJSONObject("Employee");
String empName = emp.getString("Name");
int empSalary = emp.getInt("Salary");
String string = "Employee Name: "+empName+"\n"+"Employee Salary: "+empSalary;
textView.setText(string);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
핵심 로직을 정리하면 다음과 같습니다.
- JSON_STRING: 파싱 대상인 샘플 JSON 문자열입니다. "Employee" 객체 안에 "Name"과 "Salary" 필드가 포함되어 있습니다.
- getJSONObject("Employee"): 최상위 JSON 객체에서 "Employee"라는 이름의 하위 객체를 가져옵니다.
- getString("Name") / getInt("Salary"): 해당 객체에서 이름(문자열)과 급여(정수) 값을 각각 추출합니다.
- try-catch 문: JSON 형식이 올바르지 않을 때 발생하는 JSONException을 처리해 앱이 강제 종료되지 않도록 합니다.
4단계 — AndroidManifest.xml 설정
androidManifest.xml 파일에 아래 코드가 올바르게 작성되어 있는지 확인합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 Android 스마트폰을 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 후, 툴바의 Run 아이콘을 클릭하세요. 기기 목록에서 자신의 모바일 기기를 선택하면, 화면에 아래와 같이 파싱된 결과가 표시됩니다.

참고 사항
예제 코드는 이전 버전의 android.support.v7.app.AppCompatActivity를 사용하지만, 최신 Android Studio 프로젝트는 AndroidX를 기본으로 적용합니다. 따라서 새 프로젝트에서는 import 문을 androidx.appcompat.app.AppCompatActivity로 변경해 주세요. 또한 실무에서는 서버나 네트워크로부터 받은 JSON을 파싱할 때 UI 멈춤 현상을 방지하기 위해 반드시 백그라운드 스레드에서 처리하는 것이 좋습니다.