Convert JSONArray to Object using GSON fromJson me

2020-07-30 03:00发布

问题:

I have a WCF Webservice, in which send a data model and i get this in Android by JSon(By Entity Framework),any ways, I can successfully get that JSON by this code and store all JSON Objects in JSONArray in the AsyncTas class, and in :

public class Consume extends AsyncTask<Void, Void, Void> {

            InputStream inputStream = null;
            String result = "";
            private ArrayList<Contact> contacts = new ArrayList<Contact>();

        @Override
            protected Void doInBackground(Void... params) {
                String URL = "http://x.x.x.x/MyWCF/Service1.svc/rest/getContact";
                ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
                try {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpPost post = new HttpPost(URL);
                    post.setEntity(new UrlEncodedFormEntity(param));
                    HttpResponse httpResponse = httpClient.execute(post);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    //post.setHeader("content-type", "application/json");
                    inputStream = httpEntity.getContent();

                } catch (UnsupportedEncodingException e1) {
                    Log.e("UnsupportedEncoding", e1.toString());
                    e1.printStackTrace();
                } catch (ClientProtocolException e2) {
                    Log.e("ClientProtocolException", e2.toString());
                    e2.printStackTrace();
                } catch (IllegalStateException e3) {
                    Log.e("IllegalStateException", e3.toString());
                    e3.printStackTrace();
                } catch (IOException e4) {
                    Log.e("IOException", e4.toString());
                    e4.printStackTrace();
                }
                try {
                    BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);

                    StringBuilder sBuilder = new StringBuilder();

                    String line = null;
                    while ((line = bReader.readLine()) != null) {
                        sBuilder.append(line + "\n");
                    }
                    inputStream.close();
                    result = sBuilder.toString();
                } catch (Exception e) {
                    Log.e("StringBuilding", "Error converting result " + e.toString());
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                try {
                    JSONObject object = new JSONObject(result);
                    JSONArray jArray = object.getJSONArray("getContactResult");  //here i create the JsonArray of all JsonObjects

//Here  is the solutions, We make a list of out Contact and make it as down

            List<Contact> contacts;
           Type listType = new TypeToken<List<Contact>>() {
           }.getType();
           contacts= new Gson().fromJson(String.valueOf(jArray), listType);

//And here solution is ended !

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

And i created a Contact class in android, by this code :

    public class Contact {


 @SerializedName("name")
    private String name;

        @SerializedName("lastName")
        private String lastName;

        @SerializedName("phoneNumber")
        private String phoneNumber;

        @SerializedName("latitude")
        private String latitude;

        @SerializedName("longitude")
        private String longitude;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        public String getPhoneNumber() {
            return phoneNumber;
        }

        public void setLatitude(String latitude) {
            this.latitude = latitude;
        }

        public String getLatitude() {
            return latitude;
        }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getLongitude() {
        return longitude;
    }
}

And i parse this JSONArray by Old ways ! By this method :

     ArrayList<Contact> setFields(JSONArray jsonArray) {
        ArrayList<Contact> contacts = new ArrayList<Contact>();
            for(int i=0; i<jsonArray.length(); i++) {
                try {
                    Contact contact = new Contact();
                    JSONObject object = (JSONObject) jsonArray.get(i);
                    contact.setName(object.getString("name"));
                    contact.setLastName(object.getString("lastName"));
                    contact.setPhoneNumber(object.getString("phoneNumber"));
                    contact.setLatitude(object.getString("latitude"));
                    contact.setLongitude(object.getString("longitude"));
                    contacts.add(contact);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return contacts;
        }

It works, but I do not want to handle and parse JSONArray by this old way and wanna use GSON instead,any one can help me with this sample? Here is my JSONArray and JSON Object :

    {
  "getContactResult": [
    {
      "id": 2041,
      "lastName": "xxxx",
      "latitude": xxx,
      "longitude": xxx,
      "name": "xxxx",
      "phoneNumber": "xxxx"
    }
  ]
}

Thx

回答1:

import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;

List<Contact> contacts;    
Type listType = new TypeToken<List<Contact>>() {
                    }.getType();
 contacts= new Gson().fromJson(jsonArray, listType);

This should work. make sure that your model class has same name as of json parameters and datatype. it will parse the jsonarray to type List of java



回答2:

This already answered but i want to share one thing for you.Easy and best way

There is one plugin Gson for android studio.You need to install.Then go to CTRL + insert. You can create gson file. Enter some name for java file.

Click that file then Paste you json data. Click ok. You can see your created json to gson format.

thanks hope this will help you.



回答3:

Combining Gson and JSON (a different approach), Simple for newbies to understand. If your gson containing json array.

       ArrayList<Sukh>sukhs new ArrayList<>();
       Gson gson = new Gson();
       try {
           JSONArray jsonArray = new JSONArray(fullJsonArrayString);
           for (int i = 0; i < jsonArray.length(); i++) {
               JSONObject jsonObject=jsonArray.getJSONObject(i);
               Sukh sukhObject = gson.fromJson(jsonObject.toString(), Sukh.class);
               sukhs.add(sukhObject);
           }
       } catch (JSONException e) {
           e.printStackTrace();
       }