วิธีแยกวิเคราะห์ JSON Array (ไม่ใช่ Json Object) ใน Android


90

ฉันมีปัญหาในการค้นหาวิธีแยกวิเคราะห์ JSONArray ดูเหมือนว่า:

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

ฉันรู้วิธีแยกวิเคราะห์หาก JSON เขียนแตกต่างกัน (กล่าวอีกนัยหนึ่งคือถ้าฉันมีวัตถุ json ส่งคืนแทนที่จะเป็นอาร์เรย์ของวัตถุ) แต่มันคือทั้งหมดที่ฉันมีและต้องไปกับมัน

* แก้ไข: เป็น json ที่ถูกต้อง ฉันสร้างแอพ iPhone โดยใช้ json นี้ตอนนี้ฉันต้องทำสำหรับ Android และคิดไม่ออก มีตัวอย่างมากมาย แต่ทั้งหมดนั้นเกี่ยวข้องกับ JSONObject ฉันต้องการบางอย่างสำหรับ JSONArray

ใครช่วยให้คำแนะนำหรือแบบฝึกหัดหรือตัวอย่างได้ไหม

ชื่นชมมาก!


1
ลองใช้วิธีนี้เพื่อดูว่า json ของคุณถูกต้องหรือไม่json.parser.online.fr
An-droid

คุณใช้ไลบรารีใด ๆ เพื่อแยกวิเคราะห์ json หรือไม่? ใช้ไลบรารี gson สำหรับการแยกวิเคราะห์ json มีประโยชน์มาก
nilkash

มันถูกต้อง ฉันแยกวิเคราะห์มันในแอพที่ฉันทำกับ iPhone และมันใช้งานได้ ฉันไม่รู้วิธีทำใน Android
SteBra

1
@nikash ใช่ฉันสังเกตว่าฉันสามารถใช้ gson ปัญหาเดียวคือตัวอย่างทั้งหมดที่ฉันพบมีไว้สำหรับการแยกวิเคราะห์ JSONObject ไม่ใช่ JSONArray
SteBra

โพสต์รหัสของคุณที่คุณได้ลองทำไปแล้วการให้คำตอบที่แม่นยำตามนั้นจะเป็นประโยชน์
Spring Breaker

คำตอบ:


147

ใช้ข้อมูลโค้ดต่อไปนี้เพื่อแยกวิเคราะห์ 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] และตัวเลขนั้นภายในจะรวมอาร์เรย์อีกครั้งดังนั้นหากฉันต้องการดึงข้อมูลจากโดยเฉพาะอย่างยิ่งให้บอกว่าอาร์เรย์ที่ซ้อนกันเป็นตัวเลข [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;

คุณช่วยยกตัวอย่างได้ไหมว่าฉันจะรับ JSON เป็นสตริงจาก url ที่ฉันมีได้อย่างไร
SteBra

1
DefaultHttpClientรัน-วิธีการเป็นสายการปิดกั้นจึงจะต้องมีการทำในงานที่พื้นหลังเพียงเพื่อให้ชัดเจนว่าทำไมมันอยู่ในระดับที่แยกต่างหาก
vilpe89

ฉันได้รับข้อผิดพลาดเกี่ยวกับตัวสร้างของ HttpGetTask "ตัวสร้าง HttpGetTask (OnHttpGetCompletedListener) หมายถึงชนิดที่หายไป OnHttpGetCompletedListener"
SteBra

1
คุณได้นำเข้า OnHttpGetCompletedListener หรือไม่ แบบนี้import your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
ใช่นั่นคือปัญหา ... ขอบคุณที่แก้ปัญหาของฉัน :)
SteBra

21
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
}

จากนั้น deserialize ดังนี้:

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

บทความอ้างอิง: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


ฉันคิดว่า "อินพุต" นี้จะเป็น URL ของ json หรือไม่ หรือเป็นอย่างอื่น?
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 String ของคุณ
nilkash

ตัวแปรผลลัพธ์จะเป็น url ที่ฉันต้องการดึง json จากหรือดึง json แล้ว?
SteBra

วิธีแก้ปัญหาที่ง่ายที่สุด
0x6C38

6

ในตัวอย่างนี้มีหลายอ็อบเจ็กต์ภายในอาร์เรย์ json เดียว นั่นคือ,

นี่คืออาร์เรย์ json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ... ]

นี่คือออบเจ็กต์เดียว: {"name": "name1", "url": "url1"}

สมมติว่าคุณได้รับผลลัพธ์ของตัวแปร String ที่เรียกว่า 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");


}

ฉันมีปัญหาในการรับ JSONstring จาก URL บางทีคุณอาจช่วยได้
SteBra

ขอขอบคุณสำหรับการแจกแจงเป็นตัวอย่างความชัดเจนที่ดี
shecodesthings

3

คำแนะนำที่ดีบางประการได้กล่าวไปแล้ว การใช้ GSON นั้นมีประโยชน์จริงๆและเพื่อให้ชีวิตง่ายยิ่งขึ้นคุณสามารถลองใช้เว็บไซต์นี้ได้ ซึ่งเรียกว่า jsonschema2pojo และทำอย่างนั้น:

คุณให้ json ของคุณและสร้างวัตถุ java ที่สามารถวางในโครงการของคุณ คุณสามารถเลือก GSON เพื่อใส่คำอธิบายประกอบตัวแปรของคุณได้ดังนั้นการแยกวัตถุออกจาก json ของคุณจะง่ายยิ่งขึ้น!


2

กรณีของฉันโหลดจากเซิร์ฟเวอร์ตัวอย่าง ..

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 (" ข้อความ ") คือ jsonArray; คำตอบแรกที่มีอยู่คือไม่สามารถแปลงสตริงเป็น jsonArray ได้ ฉันกำลังแก้ไข
최봉재

-1

สร้าง POJO Java Class สำหรับอ็อบเจ็กต์ในรายการดังนี้:

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

ตอนนี้เพียงแค่สร้างรายการ NameUrlClass และเริ่มต้นเป็น ArrayList ดังนี้:

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

คุณสามารถใช้เก็บอาร์เรย์ JSON ในออบเจ็กต์นี้

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

1
ยังไม่ชัดเจนว่าobj = JSONArray;ควรทำอย่างไร คืออะไรJSONArrayในบริบทนี้? มันมาจากไหน? จุดประสงค์ของการเริ่มต้นobjด้วย a new ArrayList<NameUrlClass>คืออะไรเมื่อคุณแทนที่โดยตรงในภายหลัง?
Max Vollmer

-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.