当前位置: 首页 > 知识库问答 >
问题:

NullPointerException:使用GSON在JAVA中解析JSON

牛昱
2023-03-14

我希望通过java使用Api GSON解析一个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"]
        }
    }
}

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;
    }
}
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;
    }
}
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;
    }
}
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);
    }
}
if(this.listTeleServices.get(teleserviceName) != null) 
String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();

共有1个答案

柳宾实
2023-03-14

您使用的类比解析JSON响应所需的要多!您可以删除类ListTeleServicesTeleService,只保留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);
    null

另一方面,如果直接使用map > ,Gson请参见:

>

  • 您传递了map > 的类型,JSON响应以对象{}...到目前为止一切都还好!(请记住映射只是一个对象)

    然后继续解析JSON,并且:

      null
    private HashMap<String, Record> Teleservice_1;
    private HashMap<String, Record> Teleservice_2;
    private HashMap<String, Record> Teleservice_3;
    
    @SerializedName("method_params")
    private Object[] method_parameters;
    

  •  类似资料:
    • 问题内容: 我想使用Api GSON通过java解析JSON文件以获取JSON文件的最后一个字段: 描述符.json: ListTeleServices.java: TeleService.java: Record.java: 最后是我的解析器类 JSONMainParse.java: 对我来说似乎正确,它应该显示:“ amine1”,但它在以下位置给了我一个 nullPointerExcepti

    • 因此,我试图使用GSON解析Java中的JSON对象。我正在尝试从一个网站消费一个API。这是代码:https://api.coinmarketcap.com/v1/ticker/bitcoin/ JSON如下所示: 我正在使用Jersey来消费API,我想把这个JSON转换成一个对象。 这是应该通过解析JSON来构建的对象: 这是我的代码: 我有个错误 线程“main”com.google.gs

    • 我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。

    • } 我在公共类中的主要方法是这样的: 以下是包裹的代码: } 但是我似乎没有找到正确的方法来将变量的所有值存储在列表中。现在我得到的只是parcel[data=null]。

    • 问题内容: 我有一个很长的JSON与Gson一起解析,但是为了简洁起见,我将其修剪为以下示例: 从SO和其他几个地方,我发现我需要定义一个顶级容器,例如下面的容器,但我不知道如何完成其​​定义 然后每堂课 我正在尝试解析它,这是到目前为止我编写的代码: JSON字符串存储在名为response的变量中 我的最终要求是of,并且关联。 问题答案: 第一个问题 :您的需求是: 它不必是静态的。 第二个

    • 问题内容: 我想从类型为的JSON解析数据。我正在使用Google Gson。 我有: 我的课是: 问题答案: 这是执行此操作的简单代码,我避免了所有检查,但这是主要思想。 为了使使用更加通用- 您会发现Gson的javadocs非常清楚并且很有帮助。