所以我想用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();
}
}
}
答案 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();
}
}