我想使用Api GSON通过java解析JSON文件以获取JSON文件的最后一个字段:
描述符.json:
{
"Teleservice_1" : {
"Record_1" : {
"method_name" : "mehdi",
"method_params": ["param1",2,"param3"]
},
"Record_2" : {
"method_name" : "mkyong",
"method_params": [3,"param2"]
},
"Record_3" : {
"method_name" : "amine",
"method_params": [3,"param1","param2"]
}
},
"Teleservice_2" : {
"Record_11" : {
"method_name" : "mehdi1",
"method_params": ["param11",22,"param33"]
},
"Record_22" : {
"method_name" : "mkyong1",
"method_params": [33,"param22"]
},
"Record_33" : {
"method_name" : "amine1",
"method_params": [33,"param11","param22"]
}
},
"Teleservice_3" : {
"Record_111" : {
"method_name" : "mehdi2",
"method_params": ["param111",222,"param333"]
},
"Record_222" : {
"method_name" : "mkyong2",
"method_params": [333,"param222"]
},
"Record_333" : {
"method_name" : "amine2",
"method_params": [333,"param111","param222"]
}
}
}
ListTeleServices.java:
import java.util.HashMap;
public class ListTeleServices {
private HashMap<String, TeleService> listTeleServices;
public ListTeleServices() {
}
public TeleService getTeleService(String teleserviceName) {
if(this.listTeleServices.get(teleserviceName) != null)
return this.listTeleServices.get(teleserviceName);
else
return null;
}
}
TeleService.java:
import java.util.HashMap;
public class TeleService {
private HashMap<String, Record> listRecords;
public TeleService() {
}
public Record getRecord(String recordName) {
if(this.listRecords.get(recordName) != null)
return this.listRecords.get(recordName);
else
return null;
}
}
Record.java:
public class Record {
private String method_name;
private Object[] method_parameters;
public Record(String methodName, Object[] methodParameters) {
this.method_name = new String(methodName);
this.method_parameters = methodParameters;
}
public String getMethodName() {
return this.method_name;
}
public Object[] getMethodParameters() {
return this.method_parameters;
}
public void setMethodName(String methodName) {
this.method_name = methodName;
}
public void setMethodParameters(Object[] methodParameters) {
this.method_parameters = methodParameters;
}
}
最后是我的解析器类 JSONMainParse.java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import com.google.gson.Gson;
public class JSONMainParse {
public static void main(String[] args) throws FileNotFoundException {
BufferedReader br = new BufferedReader(new FileReader("/Users/Mehdi/Desktop/descriptor.json"));
Gson gson = new Gson();
ListTeleServices teleservices = gson.fromJson(br, ListTeleServices.class);
String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();
System.out.println(methodName);
}
}
对我来说似乎正确,它应该显示:“ amine1”,但它在以下位置给了我一个 nullPointerException :
ListTeleServices.getTeleService(ListTeleServices.java:12) 这是:
if(this.listTeleServices.get(teleserviceName) != null)
并且 在JSONMainParse.main(JSONMainParse.java:15)处 是:
String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();
您对此有什么想法吗?谢谢 :)
您正在使用更多的类来解析JSON响应!您可以删除班级ListTeleServices
,TeleService
并仅保留Record
班级。
Gson gson = new Gson();
Type mapOfMapsType = new TypeToken<Map<String, Map<String, Record>>>() {}.getType();
Map<String, Map<String, Record>> map = gson.fromJson(br, mapOfMapsType);
最后,为了获得方法名称,您必须使用:
String methodName = map.get("Teleservice_2").get("Record_33").getMethodName();
当您使用类ListTeleServices
在此处解析JSON时:
ListTeleServices teleservices = gson.fromJson(br, ListTeleServices.class);
Gson所做的是分析该类ListTeleServices
并将其与JSON响应进行比较,因此它说:
您传递了一个类ListTeleServices.class
,并且JSON响应从一个对象开始{}
…到目前为止,一切正常!
然后,它继续解析JSON,并:
ListTeleServices
它找到一个属性listTeleServices
,该属性是某个对象(暂时不在乎类型)。"Teleservice_1"
,"Teleservice_2"
并且"Teleservice_3"
,但是他们都没有相同的名称listTeleServices
,所以GSON跳过所有这些价值和受让人null
的属性listTeleServices
…请记住,Gson需要JSON响应中的名称与您用来解析响应的类中的名称相同。
另一方面,如果您直接使用Map<String, Map<String, Record>>
,则Gson请参见:
您传递了的类型Map<String, Map<String, Record>>
,并且JSON响应以一个对象开始{}
…到目前为止,一切正常!(记住a Map
只是一个对象)
然后,它继续解析JSON,并:
Map<String, Map<String, Record>>
它发现必须有一些对键(串)和价值(一些对象)。"Teleservice_1"
,"Teleservice_2"
和"Teleservice_3"
和一些对象{}
,因此它可以使解析愉快。PS: 要进一步讲解,请注意您可以在班级中拥有ListTeleServices
以下属性:
private HashMap<String, Record> Teleservice_1;
private HashMap<String, Record> Teleservice_2;
private HashMap<String, Record> Teleservice_3;
它会很好地工作,但是这样一来,您就无法拥有任意数量的远程服务对象…
顺便说一句,我还意识到了 另一个错误
:在您的Response
类中,属性名称method_parameters
与JSON响应中的字段名称不匹配method_params
。您可以更改属性名称或使用注释:
@SerializedName("method_params")
private Object[] method_parameters;
我希望通过java使用Api GSON解析一个JSON文件,以获取JSON文件的最后字段: json: java:
问题内容: 我想从类型为的JSON解析数据。我正在使用Google Gson。 我有: 我的课是: 问题答案: 这是执行此操作的简单代码,我避免了所有检查,但这是主要思想。 为了使使用更加通用- 您会发现Gson的javadocs非常清楚并且很有帮助。
因此,我试图使用GSON解析Java中的JSON对象。我正在尝试从一个网站消费一个API。这是代码:https://api.coinmarketcap.com/v1/ticker/bitcoin/ JSON如下所示: 我正在使用Jersey来消费API,我想把这个JSON转换成一个对象。 这是应该通过解析JSON来构建的对象: 这是我的代码: 我有个错误 线程“main”com.google.gs
问题内容: 假设我正在使用Google的Gson库将JSON解析为Java数据结构。 如果Java字段没有对应的JSON,是否有一种简单的引发异常的方法?也就是说,我希望要求JSON具有Java结构中的所有字段。 问题答案: Gson没有JSON模式验证功能来指定必须存在一个特定的元素,也没有办法指定必须填充Java成员。拥有这样的功能(例如带有注释)可能会很好。转到“ Gson问题列表” 并提出
问题内容: 我有以下课程: 我还使用GSON从此类实例之一编码了以下JSON字符串: 我尝试运行以下命令来解码此字符串: 当我尝试运行它时,我收到以下错误消息: 我是GSON的新手,很长一段时间都没有处理Java。所以我的问题是: 有没有办法让GSON解码我的课程中的HashMap? 还是我将这一切都弄错了,应该采取不同的方法?如果是这样,我应该在哪里看? 问题答案: 很抱歉回答我自己的问题,但是
} 我在公共类中的主要方法是这样的: 以下是包裹的代码: } 但是我似乎没有找到正确的方法来将变量的所有值存储在列表中。现在我得到的只是parcel[data=null]。