Android에서 JSON 배열 (Json 개체 아님)을 구문 분석하는 방법


90

JSONArray를 구문 분석하는 방법을 찾는 데 문제가 있습니다. 다음과 같이 보입니다.

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

JSON이 다르게 작성된 경우 구문 분석하는 방법을 알고 있습니다 (즉, 객체 배열 대신 json 객체가 반환 된 경우). 그러나 그것은 내가 가진 전부이고 그것과 함께 가야합니다.

* 편집 : 유효한 json입니다. 이 json을 사용하여 iPhone 앱을 만들었습니다. 이제 Android 용으로해야하는데 알아낼 수 없습니다. 많은 예제가 있지만 모두 JSONObject와 관련이 있습니다. JSONArray에 대한 것이 필요합니다.

누군가 나에게 약간의 힌트, 튜토리얼 또는 예제를 줄 수 있습니까?

매우 감사 !


1
당신의 JSON이 유효한지 확인하려면이 시도 json.parser.online.fr
한 - 드로이드

json을 구문 분석하기 위해 라이브러리를 사용하고 있습니까? json 구문 분석을 위해 gson 라이브러리를 사용하십시오.
nilkash 2013 년

유효합니다. iPhone 용 앱에서 파싱했습니다. 작동 중입니다. 난 그냥 해달라고 안드로이드에서 작업을 수행하는 방법을 알고
SteBra

1
@nikash, 그래 나는 gson을 사용할 수 있다는 것을 알았습니다. 유일한 문제는 내가 찾은 모든 예는 된 JSONObject하지 JSONArray를 구문 분석입니다입니다
SteBra

지금까지 시도한 코드를 게시하면 정확한 답변을 제공하는 것이 도움이됩니다.
Spring Breaker

답변:


146

다음 스 니펫을 사용하여 JsonArray를 구문 분석하십시오.

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

도움이 되었기를 바랍니다.


jsonarray에 [2]와 같은 숫자가 포함 된 경우 하나의 질문입니다. [4] 그리고 그 내부의 숫자는 다시 배열을 포함하므로 특히 Java 코드에서 숫자 [4]에 중첩 된 배열을 검색하려면 int i = 4 ???
BiggDawgg

@BiggDawgg : 도움이되어 다행입니다. JSON 데이터가있는 별도의 스레드에 질문을 게시하면 쉽게 답변 할 수 있습니다.
Spring Breaker

26

난 그냥 좀주지 잭슨 예 :

먼저 JSON 문자열의 필드가있는 데이터 홀더를 만듭니다.

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

MyDataHolders 목록을 구문 분석합니다.

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

목록 항목 사용

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

내가 가지고있는 URL에서 JSON을 문자열로 어떻게 얻을 수 있습니까?
SteBra 2013-09-24

1
DefaultHttpClient들 실행-방법은 그것이 별도의 클래스에 왜 단지 명확하게하기 위해, 백그라운드 작업에서 수행되어야하므로 차단 호출입니다.
vilpe89 2013 년

HttpGetTask 생성자에 대한 오류가 발생했습니다. "생성자 HttpGetTask (OnHttpGetCompletedListener)가 누락 된 유형 OnHttpGetCompletedListener를 참조합니다."
SteBra

1
OnHttpGetCompletedListener를 가져 왔습니까? 이처럼import your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
엡, 문제가 내 문제를 해결 ... 감사합니다 :)였습니다
SteBra

20
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

산출:

name1
url1
name2
url2

12

개체를 보관할 클래스를 만듭니다.

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

그런 다음 다음과 같이 역 직렬화합니다.

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

참조 문서 : http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


이 "입력"이 해당 json의 URL이라고 가정합니다. 아니면 다른 건가요?
SteBra

이것은 매우 간단한 해결책입니다. 제 생각에 받아 들여진 것이어야합니다
FabioC

6

@Stebra이 예를 참조하십시오. 이것은 당신을 도울 수 있습니다.

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

그리고 결과를 얻을 때; 이렇게 파싱

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());

1
결과 변수는 JSONArray 문자열입니다
nilkash

결과 변수는 내가 json을 가져 오는 데 필요한 URL이거나 이미 json을 가져 왔습니까?
SteBra

가장 쉬운 용액
0x6C38

6

이 예에서는 하나의 json 배열 내에 여러 객체가 있습니다. 그건,

다음은 json 배열입니다. [{ "name": "name1", "url": "url1"}, { "name": "name2", "url": "url2"}, ...]

이것은 하나의 개체입니다. { "name": "name1", "url": "url1"}

jSonResultString이라는 문자열 변수에 대한 결과를 얻었다 고 가정합니다.

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}

URL에서 JSONstring을 얻는 데 어려움을 겪고 있습니다. 도움이 될까요?
SteBra 2013 년

예를 들어
설명해

3

몇 가지 훌륭한 제안이 이미 언급되었습니다. GSON을 사용하는 것은 정말 편리합니다. 삶을 더 쉽게하기 위해이 웹 사이트를 사용해 볼 수 있습니다. jsonschema2pojo라고하며 정확히 다음과 같이합니다.

json을 제공하면 프로젝트에 붙여 넣을 수있는 Java 객체가 생성됩니다. GSON을 선택하여 변수에 주석을 달 수 있으므로 json에서 객체를 추출하는 것이 훨씬 쉬워집니다!


2

My case Load From Server 예 ..

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

도움이 되었기를 바랍니다.


ps "jsonObject.getString ("messages ")"유형은 jsonArray입니다. 첫 번째 대답은 문자열을 jsonArray로 변환 할 수 없습니다. 내가 고칠 께.
최봉재

-1

다음과 같이 목록의 객체에 대한 POJO Java 클래스를 만듭니다.

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

이제 List of NameUrlClass를 만들고 다음과 같이 ArrayList로 초기화하기 만하면됩니다.

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

이 객체에 JSON 배열을 저장할 수 있습니다.

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]

1
무엇을해야하는지 명확 obj = JSONArray;하지 않습니다. JSONArray이 맥락에서 무엇입니까 ? 그거 어디서 났어? 초기화의 목적은 무엇인가 obj로모그래퍼은 new ArrayList<NameUrlClass>당신이 나중에 어쨌든 직접 교체 할 때?
Max Vollmer 2018 년

-3

내가 알고있는 오래된 게시물이지만 질문을 오해하지 않는 한 이것은 트릭을 수행해야합니다.

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}


-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.