通过 GSON 获取作为对象中的对象的 JSON 值时出现问题



对于下面的JSON,我想把地址的元素打印到控制台

[
{
"firstName": "Lakshay",
"lastName": "Sharma",
"age": 35,
"emailAddress": "Lakshay@Gmail.com",
"address": {
"streetAddress": "Shalimar Bagh",
"city": "Delhi",
"postCode": "110088",
"state": "Delhi",
"country": "India",
"county": "Delhi"
},
"phoneNumber": {
"home": "012345678",
"mob": "0987654321"
}
},
{
"firstName": "Virender",
"lastName": "Singh",
"age": 35,
"emailAddress": "Virender@Gmail.com",
"address": {
"streetAddress": "Palam Vihar",
"city": "Gurgaon",
"postCode": "122345",
"state": "Haryana",
"country": "India",
"county": "Delhi"
},
"phoneNumber": {
"home": "012345678",
"mob": "0987654321"
}
}
]

这是我的 Java 类,我在其中存储了 JSON 键的所有数据类型并创建了 3 个类。类客户数据类型还包含电话号码和地址类。

package com.practice.SeleniumWebDriver;
public class CustomerDataTypes {
public String firstName;
public String lastName;
public int age;
public String emailAddress;
public Address address;
public PhoneNumber phoneNumber;   
public static class Address {
public String streetAddress;
public String city;
public String postCode;
public String state;
public String country;
public String county;
}
public class PhoneNumber {
public String home;
public String mob;
}
}

在我的主类中,我编写了以下代码来访问 JSON 的所有元素,但在获取地址类(这是客户数据类型的内部类(时遇到问题

package com.practice.SeleniumWebDriver;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import com.practice.SeleniumWebDriver.CustomerDataTypes.Address;
public class ReadJsonData {
private static List<CustomerDataTypes> customerList;
public static List<CustomerDataTypes.Address> CustomerAddress;
//private static List<CustomerDataTypes.PhoneNumber> CustomerPhoneNumber;
public static String CustomerFilePath="D:\eclipse-workspace\SeleniumWebDriver\src\test\java\testDataTypes\CustomerData.json";

public static void  main(String args[]) throws FileNotFoundException 
{
customerList=separator();
getCustomerByName("firstName");
CustomerAddress=SeparatorForAddress();
getCustomerAddress("streetAddress");
}
public static List<CustomerDataTypes> separator() throws FileNotFoundException
{
Gson gson=new Gson();
JsonReader reader=new JsonReader(new FileReader(CustomerFilePath));
CustomerDataTypes[] data=gson.fromJson(reader, CustomerDataTypes[].class);
System.out.println(Arrays.asList(data));
return Arrays.asList(data);

}
public final static CustomerDataTypes getCustomerByName(String customerName){
for(CustomerDataTypes customer : customerList) {
if(customer.firstName.equalsIgnoreCase(customerName))
System.out.println("");
System.out.println(customer.firstName);
System.out.println(customer.lastName);
//System.out.println(customer.address);
return customer;
}
return null;
}
public static List<Address> SeparatorForAddress() throws FileNotFoundException
{
Gson gson=new Gson();
JsonReader reader=new JsonReader(new FileReader(CustomerFilePath));
Address[] data=gson.fromJson(reader, Address[].class);
System.out.println(Arrays.asList(data));
return Arrays.asList(data);

}
public final static CustomerDataTypes.Address getCustomerAddress(String adr)
{
for(CustomerDataTypes.Address address : CustomerAddress )
{
System.out.println(address.streetAddress);
System.out.println(CustomerAddress);
if(address.streetAddress.equals(adr))
System.out.println("Hello");
System.out.println(address.streetAddress);
System.out.println(address.country);
System.out.println(address.postCode);
return address;
}
return null;
}
}

在上面的主类中,getCustomerAddress((,S.O.P(address.streetAddress(抛出空值。

以下是控制台上的输出:

[com.practice.SeleniumWebDriver.CustomerDataTypes@17579e0f, com.practice.SeleniumWebDriver.CustomerDataTypes@4d41cee]
Lakshay
Sharma
[com.practice.SeleniumWebDriver.CustomerDataTypes$Address@3712b94, com.practice.SeleniumWebDriver.CustomerDataTypes$Address@2833cc44]
null
java.lang.NullPointerException
at com.practice.SeleniumWebDriver.ReadJsonData.getCustomerAddress(ReadJsonData.java:72)
at com.practice.SeleniumWebDriver.ReadJsonData.main(ReadJsonData.java:25)

你能帮忙弄清楚吗?

如果我修改getCustomerByName((方法,我可以得到所有类的结果。

public final static CustomerDataTypes getCustomerByName(String customerName){
System.out.println(customerList.size());
for(int i=0;i<customerList.size();i++)
{
System.out.println("The value of i is" +i);
System.out.println(customerList.get(i).firstName);
System.out.println(customerList.get(i).lastName);
System.out.println(customerList.get(i).emailAddress);
System.out.println(customerList.get(i).address.city);
System.out.println(customerList.get(i).phoneNumber.mob);

}
return null;
}

你得到了NullPointerException,因为你从getCustomerByName()方法返回null

,如下所示
public final static CustomerDataTypes getCustomerByName(String customerName){
System.out.println(customerList.size());
for(int i=0;i<customerList.size();i++) {
System.out.println("The value of i is" +i);
System.out.println(customerList.get(i).firstName);
System.out.println(customerList.get(i).lastName);
System.out.println(customerList.get(i).emailAddress);
System.out.println(customerList.get(i).address.city);
System.out.println(customerList.get(i).phoneNumber.mob);
}
return null;  // root cause for the Exception
}

按如下方式进行修改,

public final static CustomerDataTypes getCustomerByName(String customerName){
System.out.println(customerList.size());
for(int i = 0; i < customerList.size(); i++) {
System.out.println("The value of i is" +i);
System.out.println(customerList.get(i).firstName);
System.out.println(customerList.get(i).lastName);
System.out.println(customerList.get(i).emailAddress);
System.out.println(customerList.get(i).address.city);
System.out.println(customerList.get(i).phoneNumber.mob);
// changes to be made
CustomerDataTypes custData = customerList.get(i);
if (customerName.equalsIgnoreCase(custData.firstName)) {
return custData;
}
}
return null;
}

由于如果给定名称不匹配,则从方法返回nullgetCustomerByName()因此应在使用该对象之前检查 null 安全性。

CustomerDataTypes data = getCustomerByName("Virender");
if (data != null) {
// code
}

请注意,我正在将实际用户名(Virender(作为参数传递给getCustomerByName()方法,而不是您在代码中使用的JSON键。

同样的事情也适用于getCustomerByAddress()方法。根据您的要求进行更改。

最新更新