Android에서 JSON 객체 전송 및 구문 분석 [닫기]


137

JSON 객체 형식의 메시지를 서버에 보내고 서버의 JSON 응답을 구문 분석하고 싶습니다.

JSON 객체의 예

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}

속성별로 속성을 이동하여 JSON을 수동으로 구문 분석하려고합니다. 이 프로세스를 쉽게하기 위해 사용할 수있는 라이브러리 / 유틸리티가 있습니까?


2
해당 URL을 더 이상 사용할 수 없습니다 ... 업데이트 할 수 있습니까?
Cipi

1
여기에 상세한 예입니다 : 안드로이드 - JSON 구문 분석 예
Paresh Mayani

1
@ Paresh Mayani & @ primpap .. get 메소드를 사용하여 서버에서받은 JSON을 사용하여 서버에서 데이터를 채울 수 있다는 것을 알고 있습니다. 편리합니다 ....하지만 post 메소드를 사용하여 데이터를 서버로 보내려면 데이터를 JSON으로 다시 전송합니다. 나는 primpap 질문의 인용문을 참조하고 있습니다. "Jjango 서버에 메시지를 JSON 객체 형식으로 보내려고합니다."..... 서버에서 Mysql을 사용하고 있습니다 .... 또는 JSON 객체를 보냅니 까? ... 당신은 나 에게이 정보를 명확히 할 수 있습니까 .... 또는 개념을 이해하는 데 도움이되는 링크가 도움이 될 것입니다, 감사합니다
Devrath

답변:


118

나는 이것이 언급되지 않은 것에 놀랐습니다 : json.org의 작은 패키지로 베어 본 대신 수동 프로세스를 사용하는 대신 GSon과 Jackson은 사용하기가 훨씬 편리합니다. 그래서:

따라서 일부 반 트리 트리 노드 또는 목록 및 맵이 아닌 자신의 POJO에 실제로 바인딩 할 수 있습니다. (그리고 Jackson은 적어도 실제 객체 대신에 이것을 원한다면 JsonNode, Map, List와 같은 것들에 바인딩 할 수 있습니다 (아마도 GSON도 확실하지 않습니다))

2014 년 3 월 19 일 수정 :

또 다른 새로운 경쟁자는 Jackson jr 라이브러리입니다. Jackson ( jackson-core) 과 동일한 빠른 스트리밍 파서 / 제너레이터를 사용 하지만 데이터 바인딩 부분은 작습니다 (50kB). 기능은 더 제한적이지만 (주석은없고 일반적인 Java Bean) 성능 측면에서는 빠르며 초기화 (first-call) 오버 헤드도 매우 낮아야합니다. 따라서 특히 작은 응용 프로그램의 경우 좋은 선택 일 수 있습니다.


10
GSON의 경우 +1 우리는 특히 Android 앱에서 GSON의 스트리밍 지원 sites.google.com/site/gson/streaming을 사용 했습니다.
Andre Steingress

FWIW, Jackson은 스트리밍 API를 가지고 있습니다 : wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
또한 GSON 스트리밍의 경우 +1입니다. 처음에는 Jackson 스트리밍을 구현했지만 디버그 버전에서는 작동하지만 ProGuard는 수많은 오류를 발생 시켰으며 릴리스 버전은 추적하기 어려운 충돌을 일으 킵니다. 이것이 Jackson 관련 문제는 아니라고 확신하지만 GSON으로 전환하여 정상적으로 작동하고 스트리밍을 위해 추가 14kB 만 필요했습니다.
Sven

그리고 어리석은 예측할 수없는 json 믹싱 문자열과 예 : [ "toto", "tata", [ "monty", [ "tor", "python"]]]? (재사용 기능을 필요로하는 재귀 함수를 필요로하는 종류의 데이터 구조)
christophe31

85

org.json.JSONObjectorg.json.JSONTokener를 사용할 수 있습니다 . 이 클래스에는 Android SDK가 제공되므로 외부 라이브러리가 필요하지 않습니다.


죄송합니다! 나는 그것을 놓쳤다. 실제로 이들은 웹 사이트의 org.json 라이브러리입니다.
Gaurav Vaish

이것이 내가 사용하는 것이며 매력처럼 작동합니다.
Adam

예제 나 그에 대한 링크를 제공 할 수 있다면 좋을 것입니다. 그렇게 배우는 것이 더 쉽습니다. :)
Primal Pappachan 16:12의


1
훨씬 더 편리하고 작성하는 코드가 적습니다. 수십 대신 한두 줄.
StaxMan

31

데이터가 명확한 구조를 가지고 있다면 GSON이 사용하기 쉽고 가장 쉬운 방법입니다.

gson을 다운로드 하십시오 .

참조 된 라이브러리에 추가하십시오.

package com.tut.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class SimpleJson extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String jString = "{\"username\": \"tom\", \"message\": \"roger that\"}  ";


        GsonBuilder gsonb = new GsonBuilder();
        Gson gson = gsonb.create();
        Post pst;

        try {
            pst = gson.fromJson(jString,  Post.class);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

포스트 클래스 코드

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}

4
가치있는 것은 코드를 단순화 할 수 있습니다. JSONObject 변환은 불필요합니다. GSon의 경우 setter 및 getter는 선택 사항입니다. 원하는 경우 추가 할 수 있지만 꼭 필요한 것은 아닙니다.
StaxMan

4
StaxMan의 의견을 명확히하기 위해. 귀하의 예는 jString을 가져 와서 JSONObject로 변환 한 다음 gson이 읽을 수 있도록 String으로 다시 변환하는 것입니다. pst = gson.fromJson (jString, Post.class)를 사용하십시오. 나는 이것이 또한 try-catch의 필요성을 제거 할 것이라고 믿습니다. StaxMan도 지적했듯이 Post.class의 setter 및 getter는 값을 추가하지 않습니다. 다른 사람들이 여러분의 모범을 바로 잡는 데 도움이 될 것입니다.
Matt

답변에서 이중 변환 부분을 제거했습니다
whlk

4

이것은 JsonParser 클래스입니다

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

참고 : DefaultHttpClient는 더 이상 SDK 23에서 지원되지 않으므로이 코드와 함께 대상 SDK 21을 사용하는 것이 좋습니다.


3

JSON에는 실제로 아무것도 없습니다. 중괄호는 "객체"(연관 배열) 용이며 대괄호는 키가없는 배열 (숫자 색인)입니다. Android에서 작업하는 한 SDK에 포함 된 클래스가 준비되어 있습니다 (다운로드 필요 없음).

이 클래스를 확인하십시오 : http://developer.android.com/reference/org/json/package-summary.html


나는 당신이 각괄호가 아닌 중괄호를 의미한다고 가정합니다!
Gaurav Vaish

2

다른 답변에 따르면 Jackson과 GSON (Android 용으로 인기있는 추가 JSON 라이브러리)과 json.org (Android에 포함 된 기본 JSON 패키지)가 언급되었습니다.

그러나 Android에 자체 기능을 갖춘 JSON API가 있다는 점도 주목할 가치가 있다고 생각합니다.

이것은 Honeycomb : API 레벨 11에 추가되었습니다.

이것은
android.util.JsonReader : docssource로 구성됩니다
. android.util.JsonWriter : docssource

또한 Jackson과 GSON으로 다시 돌아가는 또 하나의 추가 고려 사항을 추가 할 것입니다 .Android. * 패키지 대신 타사 라이브러리를 사용하는 것이 유용하다는 것을 알았습니다. 그러면 내가 작성한 코드가 클라이언트와 서버간에 공유 될 수 있기 때문입니다. 이것은 특히 JSON과 관련이 있으며, 다른 쪽 끝으로 보내기 위해 한쪽 끝에서 JSON으로 데이터를 직렬화하려는 경우가 있습니다. 이와 같은 사용 사례의 경우 Java를 양쪽에서 사용하면 android. * 종속성을 피하는 데 도움이됩니다.

또는 관련 android. * 소스 코드를 가져 와서 서버 프로젝트에 추가 할 수는 있지만 시도하지는 않았습니다 ...



1

이걸 가져 오기만하면됩니다

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

다른 객체 내에 jsonObject를 가질 수 있기 때문에 두 객체를 사용하는 메신저

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

그런 다음 게시물 json을 다른 것과 같이 넣습니다.

  param.put("post",post);

이것은 내가 요청을하는 데 사용하는 방법입니다

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

연결 설정

        urlConnection = new URL("your url");
        connection = (HttpURLConnection) urlConnection.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
        connection.setReadTimeout(60000);
        connection.setConnectTimeout(60000);
        connection.connect();

출력 스트림 설정

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

나는 이것을 사용하여 logcat에서 볼 수 있습니다.

        Log.d("OUTPUT STREAM  " ,param);
        dataOutputStream.writeBytes(param);
        dataOutputStream.flush();
        dataOutputStream.close();

        InputStream in = new BufferedInputStream(connection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        result = new StringBuilder();
        String line;

여기에 문자열이 구성됩니다

        while ((line = reader.readLine()) != null)
        {
            result.append(line);
        }

이 로그를 사용하여 응답에서 어떤 내용이 나오는지 확인합니다.

         Log.d("INPUTSTREAM: ",result.toString());

서버 응답을 포함하는 문자열로 json 인스 턴싱

        jResponse=new JSONObject(result.toString());

    }
    catch (IOException e) {
        e.printStackTrace();
        return jResponse=null;
    } catch (JSONException e)
    {
        e.printStackTrace();
        return jResponse=null;
    }
    connection.disconnect();
    return jResponse;
}

시간 내 주셔서 감사합니다. django 서버에 base64로 인코딩 된 문자열을 보내는 데 코드를 사용하지만 서버로 보내기 위해 버튼을 클릭하면 APP가 중단됩니다. 이 문제를 해결하는 방법을 알려 주시겠습니까?
노먼 마왓

0

당신이 무료로 사용할 수있는 도구를 제안하는 것보다 안드로이드에서 빠른 JSON 구문 분석을 찾고 있다면.

JSON 클래스 생성기 도구

무료로 사용할 수 있으며 1-2 초 내에 모든 JSON 구문 분석 클래스를 작성합니다. : : D


0

GSON 등의 사용을 권장하는 등 사용자가 이미 훌륭한 답변을 제공하고 있지만 org.json의 사용을 제안하고 싶습니다 . 대부분의 GSON 기능이 포함되어 있습니다. 또한 JSON 문자열에 대한 인수로 json 문자열을 전달할 수 있으며 다음과 같이 휴식을 처리합니다.

JSONObject json = new JSONObject("some random json string");

이 기능은 제가 개인적으로 좋아하는 것입니다.


0

json 구문 분석에 사용할 수있는 다양한 오픈 소스 라이브러리가 있습니다.

org.json :-json 을 읽거나 쓰려면이 라이브러리를 사용할 수 있습니다. 먼저 JsonObject를 작성하십시오.

JSONObject jsonObj = new JSONObject(<jsonStr>);

이제이 객체를 사용하여 값을 얻으십시오.

String id = jsonObj.getString("id");

여기에서 완전한 예를 볼 수 있습니다

Jackson databind : -json을 특정 POJO 클래스에 바인딩하고 구문 분석하려면 jackson-databind 라이브러리를 사용할 수 있습니다. 이는 json을 POJO 클래스에 바인딩합니다.

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

여기에서 완전한 예를 볼 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.