Cách phân tích cú pháp Mảng JSON (Không phải Đối tượng Json) trong Android


90

Tôi gặp khó khăn khi tìm cách phân tích cú pháp JSONArray. Nó trông như thế này:

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

Tôi biết cách phân tích cú pháp nếu JSON được viết khác (Nói cách khác, nếu tôi trả về đối tượng json thay vì một mảng đối tượng). Nhưng đó là tất cả những gì tôi có và phải đi cùng với nó.

* CHỈNH SỬA: Nó là một json hợp lệ. Tôi đã tạo một ứng dụng iPhone bằng json này, bây giờ tôi cần làm điều đó cho Android và không thể tìm ra. Có rất nhiều ví dụ trên mạng, nhưng chúng đều liên quan đến JSONObject. Tôi cần một cái gì đó cho JSONArray.

Ai đó có thể vui lòng cho tôi một số gợi ý, hoặc một hướng dẫn hoặc một ví dụ không?

Nhiều đánh giá cao !


1
Hãy thử này để xem nếu json của bạn là hợp lệ json.parser.online.fr
An-droid

bạn đang sử dụng thư viện nào để phân tích cú pháp json? Sử dụng thư viện gson để phân tích cú pháp json. Helpfull.
nilkash

Nó hợp lệ. Tôi đã phân tích cú pháp nó trong một ứng dụng tôi đã làm cho iPhone Và nó đang hoạt động. Tôi chỉ dont biết làm thế nào để làm điều đó trong Android
SteBra

1
@nikash, vâng, tôi nhận thấy rằng tôi có thể sử dụng gson. Chỉ có vấn đề là, tất cả các ví dụ tôi tìm thấy là dành cho phân tích một JSONObject không JSONArray
SteBra

Đăng mã của bạn mà bạn đã thử cho đến nay, sẽ rất hữu ích nếu bạn đưa ra câu trả lời chính xác.
Spring Breaker

Câu trả lời:


147

sử dụng đoạn mã sau để phân tích cú pháp 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");
}

Hy vọng nó giúp.


chỉ một câu hỏi nếu jsonarray bao gồm các số như [2]. [4] và các số bên trong lại bao gồm một mảng, vì vậy nếu tôi muốn truy xuất từ ​​đặc biệt, giả sử mảng được lồng trong số [4] trong mã java, tôi phải viết int i = 4 ???
BiggDawgg

@BiggDawgg: Rất vui vì nó đã giúp bạn. Đăng câu hỏi của bạn trong một chuỗi riêng với dữ liệu JSON để tôi có thể dễ dàng trả lời.
Spring Breaker

26

Tôi chỉ đưa ra một ví dụ nhỏ về Jackson :

Trước tiên, hãy tạo một người giữ dữ liệu có các trường từ chuỗi JSON

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

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

Và phân tích cú pháp danh sách MyDataHolders

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

Sử dụng các mục danh sách

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

Bạn có thể cho tôi một ví dụ làm cách nào để lấy JSON dưới dạng một chuỗi từ url mà tôi có được không?
SteBra,

1
Phương DefaultHttpClientthức thực thi s là một lệnh gọi chặn vì vậy nó phải được thực hiện trong một tác vụ nền, chỉ để làm rõ lý do tại sao nó nằm trong lớp riêng biệt.
vilpe89

Tôi đang gặp lỗi về hàm tạo của HttpGetTask. "Các nhà xây dựng HttpGetTask (OnHttpGetCompletedListener) đề cập đến loại thiếu OnHttpGetCompletedListener"
SteBra

1
bạn đã nhập OnHttpGetCompletedListener chưa? Như thế nàyimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Yeap, đó là vấn đề ... Cảm ơn để giải quyết vấn đề của tôi :)
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);
    }   
}   

Đầu ra:

name1
url1
name2
url2

12

Tạo một lớp để chứa các đối tượng.

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

Sau đó deserialize như sau:

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

Bài viết tham khảo: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Tôi giả sử "đầu vào" này sẽ là URL đến json đó? Hay nó là cái gì khác?
SteBra

Đây là một giải pháp rất đơn giản. Nó nên là một chấp nhận quan điểm của tôi
FabioC

6

@Stebra Xem ví dụ này. Điều này có thể giúp bạn.

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

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

Và khi bạn nhận được kết quả; phân tích cú pháp như thế này

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

1
Biến kết quả là bạn JSONArray Chuỗi
nilkash

Biến kết quả sẽ là url tôi cần tìm nạp json từ hay json đã được tìm nạp?
SteBra,

đến nay là giải pháp dễ nhất
0x6C38

6

Trong ví dụ này có một số đối tượng bên trong một mảng json. Đó là,

Đây là mảng json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ...]

Đây là một đối tượng: {"name": "name1", "url": "url1"}

Giả sử rằng bạn đã nhận được kết quả cho một biến Chuỗi được gọi là 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");


}

Tôi đang gặp khó khăn khi lấy chuỗi JSON của tôi từ URL. Có lẽ bạn có thể giúp với điều đó?
SteBra,

Cảm ơn bạn đã chia nhỏ nó với các ví dụ, rõ ràng
ryvianstyron

3

Một vài gợi ý tuyệt vời đã được đề cập. Sử dụng GSON thực sự rất tiện dụng và để làm cho cuộc sống dễ dàng hơn, bạn có thể thử trang web này Nó có tên là jsonschema2pojo và thực hiện chính xác điều đó:

Bạn cung cấp cho nó json của bạn và nó tạo ra một đối tượng java có thể dán vào dự án của bạn. Bạn có thể chọn GSON để chú thích các biến của mình, vì vậy việc trích xuất đối tượng từ json của bạn thậm chí còn dễ dàng hơn!


2

Ví dụ về trường hợp của tôi Tải từ máy chủ ..

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"));
                }

Hy vọng nó sẽ giúp


kiểu ps "jsonObject.getString (" messages ")" là jsonArray; câu trả lời tồn tại đầu tiên là không thể chuyển đổi chuỗi thành jsonArray; tôi đang sửa nó.
최봉재

-1

Tạo một Lớp Java POJO cho các đối tượng trong danh sách như sau:

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

Bây giờ chỉ cần tạo một danh sách NameUrlClass và khởi tạo nó thành một ArrayList như sau:

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

Bạn có thể sử dụng lưu trữ mảng JSON trong đối tượng này

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

1
Nó không rõ ràng những gì obj = JSONArray;phải làm. Là gì JSONArraytrong bối cảnh này? Nó đến từ đâu? Mục đích của việc khởi tạo objbằng a new ArrayList<NameUrlClass>, khi bạn thay thế nó ngay sau đó bằng cách nào?
Max Vollmer

-3

Bài cũ tôi biết, nhưng trừ khi tôi hiểu sai câu hỏi, điều này sẽ thực hiện thủ thuật:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.