使用GSON从API JSON解析内部数组

时间:2014-09-19 18:05:46

标签: java json parsing gson

所以我想用GSON解析我从api得到的json。所有的例子都很清楚,我把它完美地运作了。但现在API给了我这样的东西。只是为第二个花括号中的项目创建一个类并不起作用,见下文。

所以我的问题是,是否有人知道如何使这项工作?

SOLUTION:

在本地存储,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;  
    }  
} 

主类,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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

由于你有一个内部数组,GSON希望这个内部数组作为一个内部类,因为它没有找到一个,所以很可能会抛出错误。按如下方式创建您的成员类:

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
}

从此类构造您的成员对象,并像通常使用静态嵌套类一样引用它。

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

要从内部类访问方法,只需执行以下操作:     //了解我现在如何访问现有实例而不是创建新实例     //我正在思考,忘记了这一点     Member.Details details = memberObj.getDetails();     String item = details.getterMethodForItem();

答案 1 :(得分:0)

以下是如何做到的:

基本上,您将获得输入( a key-value pair, in your case key is "Peter" and value is your Member object details)的映射,因此您必须遍历映射值(其中映射值是您的成员对象)并将字符串转换为成员对象。 / p>

这里我使用了StringReader(只是从字符串中读取json)而不是BufferedReader(从.json文件中读取)。

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

}

    }

修改 这是从file中读取的另一个版本。只需用以下内容替换main方法,确保FileReader路径正确:

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

打印:

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

对于您在评论中提出的问题:

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