NullPointerException:使用GSON在JAVA中解析JSON

NullPointerException:使用GSON在JAVA中解析JSON,java,json,nullpointerexception,gson,Java,Json,Nullpointerexception,Gson,我想使用Api GSON通过java解析JSON文件,以获取JSON文件的最后字段: descriptor.json: { "Teleservice_1" : { "Record_1" : { "method_name" : "mehdi", "method_params": ["param1",2,"param3"] }, "Record_2" : { "method

我想使用Api GSON通过java解析JSON文件,以获取JSON文件的最后字段:

descriptor.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"]
        }
    }
}
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;
    }
}
ListTeleServices.java:

{
    "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"]
        }
    }
}
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;
    }
}
最后是我的解析器类,JSONMainParse.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;
    }
}
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);
    }
}
在我看来,它似乎是正确的,应该显示:“amine1”,但它在以下位置给我一个空点异常

ListTeleServices.getTeleService(ListTeleServices.java:12),它是:

if(this.listTeleServices.get(teleserviceName) != null) 
String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();
在JSONMainParse.main(JSONMainParse.java:15)上,它是:

if(this.listTeleServices.get(teleserviceName) != null) 
String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();
你知道这件事吗?谢谢:)

初始化

private HashMap<String, TeleService> listTeleServices;
私有HashMap listTeleServices;
作为

private HashMap listTeleServices=new HashMap();
在当前代码中,您正试图调用
null
对象引用上的
get()
,当您试图调用null对象上的实例方法时,该对象引用会引发错误。

更改此设置:

private HashMap<String, TeleService> listTeleServices;
私有HashMap listTeleServices;
对此

private HashMap<String, TeleService> listTeleServices = new HashMap<String,TeleService>();
private HashMap listTeleServices=new HashMap();
解决方案: 您正在使用比解析JSON响应所需的更多的类!您可以删除您的类
ListTeleServices
TeleService
,只保留您的
记录

Gson gson = new Gson();
Type mapOfMapsType = new TypeToken<Map<String, Map<String, Record>>>() {}.getType();
Map<String, Map<String, Record>> map = gson.fromJson(br, mapOfMapsType);

说明: 当您在此处使用类
ListTeleServices
解析JSON时:

ListTeleServices teleservices = gson.fromJson(br, ListTeleServices.class);
Gson所做的是分析类
ListTeleServices
,并将其与JSON响应进行比较,因此它说:

  • 您传递了一个类
    ListTeleServices.class
    ,JSON响应以对象
    {}
    开始。。。到目前为止一切都很好

  • 然后继续解析JSON,并:

    • 在类
      ListTeleServices
      中,它找到一个属性
      ListTeleServices
      ,它是某个对象(暂时不介意类型)
    • 然而,在JSON响应中,它找到了三个元素
      “Teleservice_1”
      “Teleservice_2”
      “Teleservice_3”
      ,但它们都没有相同的名称
      listTeleServices
      ,因此Gson跳过所有这些值,并将
      null
      赋值给属性
      listTeleServices
  • 请记住,Gson需要JSON响应中的名称与您用来解析响应的类中的名称相同

    另一方面,如果直接使用
    地图
    ,请参见:

  • 您传递了
    Map
    的类型,JSON响应以对象
    {}
    开始。。。到目前为止一切都很好!(请记住,
    Map
    只是一个对象)

  • 然后继续解析JSON,并:

    • Map
      中,可以看到一定有一些键(字符串)和值(一些对象)对
    • 在JSON响应中,它发现一些字符串对
      “Teleservice_1”
      “Teleservice_2”
      “Teleservice_3”
      ,以及一些对象
      {}
      ,因此它可以愉快地继续解析
  • 注:进一步说,请注意,您的类中可能有以下属性:

    private HashMap<String, Record> Teleservice_1;
    private HashMap<String, Record> Teleservice_2;
    private HashMap<String, Record> Teleservice_3;
    

    为什么要用原始类型初始化它?谢谢,但它仍然在以下位置给我一个NullPointerException:
    String methodName=teleservices.getTeleService(“Teleservice_2”).getRecord(“Record_33”).getMethodName()现在编辑!!!我不在IDE前面,所以这样写是为了节省时间。只需检查
    teleservices
    teleservices.getTeleService(“Teleservice_2”)
    teleservices.getTeleService(“Teleservice_2”).getRecord(“Record_33”)
    是否为
    null
    !!!问题不在于地图的日化,Gson会为你做这件事!问题是JSON没有被正确解析…谢谢,是的
    teleservices
    不是空的,但是
    teleservices.getTeleService(“Teleservice_2”)
    返回空的…谢谢!它起作用了!但是我真的不明白为什么我们必须使用
    Map
    而不是创建大量的类并使用它们的getter,我现在明白了!多谢各位!