简体   繁体   中英

Parse inner array with GSON, From API JSON

So I would like to parse the json I get from an api with GSON. all the examples are very clear and I got it working perfectly. But now the API gave me somthing like this. Just making a class for the items with in the second curly braces doesn't work, see below.

So my question is does anyone have an idea how to make this work??

SOLUTION:

Stored this locally, member.json

{"Peter":{"id":585897,"name":"PhPeter","profileIconId":691,"age":99,"email":"peter@adress.com "}}

Class, Member.java

package JsonPackage;

public class Summoner {

    int id;  
    String name;  
    int profileIconId;
    int summonerLevel;
    long revisionDate;

    //getters setters  

    public String getName() {  
        return name;  
    }  

    public int getId() {  
        return id;  
    } 

    public int getProfileIconId() {  
        return profileIconId;  
    }  

    public int getSummonerLevel() {  
        return summonerLevel;  
    }  

    public long getRevisionDate() {  
        return revisionDate;  
    }  
} 

Main class, MemberRead2Java.java:

package JsonPackage;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.StringReader;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import com.google.gson.Gson;

public class ReadSummonerObject {

    public static void main(String[] args) {
        Gson gson = new Gson();  

        try {  

            BufferedReader br = new BufferedReader(new FileReader("C:\\member.json"));  //path to your file


            Object obj = gson.fromJson(br, Object.class);
            if (obj instanceof Map) {
                Map map = (Map) obj;
                Collection coll = map.values();
                Iterator iter = coll.iterator();
                while (iter.hasNext()) {
                    Object str = iter.next();

                    StringReader sr = new StringReader(str.toString());
                    Summoner summonerObj = gson.fromJson(sr, Summoner.class);
                    System.out.println("Id: " + summonerObj.getId());
                    System.out.println("Name: " +summonerObj.getName());
                    System.out.println("ProfileIconID: " + summonerObj.getProfileIconId());
                    System.out.println("SummonerLevel: " + summonerObj.getSummonerLevel());
                    System.out.println("RevisionDate: " + summonerObj.getRevisionDate());
                }

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

Since you have an inner array, GSON expects this inner array as an inner class and since it doesn't find one, it is likely throwing errors. Create your member class as follows:

class Member {

    String member_name; // To hold the member name in the outer array
    Details details; // You need an existing instance to parse the data into. I missed this.

    // Inner class corresponding to inner array
    public static class Details {
        int id;
        String name;
        int profileIconId;
        int age;
        String email;
        // Getters and setters for inner class
    }
    // Getters and setters for outer class
    public Details getDetails() {
        return this.details;
    }
    // Other getters and setters
}

Construct your member object from this class and reference it as you usually would with static nested classes.

Member memberObj = gson.fromJson(br, Member.class); 

To access methods from your inner class, simply do the following: // See how I am now accessing an existing instance rather than creating a new instance // I was thinking on the fly and forgot about this Member.Details details = memberObj.getDetails(); String item = details.getterMethodForItem();

Here's how you can do that:

Basically you'll get a map for your input ( a key-value pair, in your case key is "Peter" and value is your Member object details) , so you have to iterate over the map values , (where map values are your Member objects) and just convert the Strings to Member objects.

here I've used the StringReader (just read the json from the string) instead of the BufferedReader (reading from the .json file).

public static void main(String[] args)   {

String json ="{\"Peter\":{\"id\":585897,\"name\":\"PhPeter\",\"profileIconId\":691,\"age\":99,\"email\":\"peter@adress.com \"}}";
Gson gson = new Gson();  
StringReader reader = new StringReader(json);
   //convert the json string back to object  
Object obj = gson.fromJson(reader, Object.class);  
if(obj instanceof Map){
    Map map =(Map)obj;
    Collection coll = map.values();
    Iterator iter = coll.iterator();
    while(iter.hasNext()){
         Object str = iter.next();

        StringReader sr = new StringReader(str.toString());
        Member memberObj = gson.fromJson(sr, Member.class); 
     System.out.println("Id: " + memberObj.getId());  
     System.out.println("Name: " + memberObj.getName());  
     System.out.println("ProfileIconID: " + memberObj.getProfileIconId());  
     System.out.println("Age: " + memberObj.getAge());  
     System.out.println("Email: " + memberObj.getEmail());  
    }

}

    }

Edit: Here is another version reading from file.Just replace the main method with the following, make sure the FileReader path is correct:

public static void main(String[] args) {

        Gson gson = new Gson();
        try {
            BufferedReader br = new BufferedReader(new FileReader("src/Member.json"));

            Object obj = gson.fromJson(br, Object.class);
            if (obj instanceof Map) {
                @SuppressWarnings("unchecked")
            Map<String,Object> map = (Map<String,Object>) obj;
            Collection<Object> coll = map.values();
            Iterator<Object> iter = coll.iterator();
                while (iter.hasNext()) {
                    Object str = iter.next();

                    StringReader sr = new StringReader(str.toString());
                    Member memberObj = gson.fromJson(sr, Member.class);
                    System.out.println("Id: " + memberObj.getId());
                    System.out.println("Name: " + memberObj.getName());
                    System.out.println("ProfileIconID: "
                            + memberObj.getProfileIconId());
                    System.out.println("Age: " + memberObj.getAge());
                    System.out.println("Email: " + memberObj.getEmail());
                }

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

prints:

Id: 585897
Name: PhPeter
ProfileIconID: 691
Age: 99
Email: peter@adress.com

For what you have asked in comments:

public static void main(String[] args) {
        Gson gson = new Gson();  

        try {   

            BufferedReader br = new BufferedReader(new FileReader("src/Members.json"));  //path to your file


            Object obj = gson.fromJson(br, Object.class);
            if (obj instanceof Map) {
                Map map = (Map) obj;
                Collection coll = map.values();    
                Iterator iter = coll.iterator();
                JsonParser parser = new JsonParser();
                while (iter.hasNext()) {

                    Object str = iter.next();
                  JsonArray jsonArr = parser.parse(str.toString()).getAsJsonArray();
                    for(int i=0;i<jsonArr.size();i++){

                    Member memberObj = gson.fromJson(jsonArr.get(i).toString(), Member.class);
                    System.out.println("Id: " + memberObj.getId());
                    System.out.println("Name: " +memberObj.getName());
                    System.out.println("ProfileIconID: " + memberObj.getProfileIconId());
                    System.out.println("Email: " + memberObj.getEmail());
                    System.out.println("Age: " + memberObj.getAge());
                    }
                } 

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM