Gson 返回 null
Gson returning null
我在使用 JSON 时遇到问题,我目前有这个 class 可以将来自我的 api 的 json 响应转换为一个对象,但它返回所有值空 -
public class User {
public String username;
public User(String username) throws IOException {
this.username = username;
URL url = new URL(urlhere);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)");
String response = ApiRequest.getResponse(connection);
connection.disconnect();
Gson gson = new Gson();
gson.fromJson(response, this.getClass());
}
public int id;
public String email;
public String role;
public String plan;
public String planEndDate;
}
我是 json 的新手,请记住这一点,我可能遗漏了什么。
JSON 响应示例:
{"id":7,"username":"xx","email":"xx","role":"administrator","plan":"xx","planEndDate":"xx"}
下次你应该读How To Ask and make sure your code is a Minimal Complete Verifiable Example。这里不需要整个网络访问,您可以只在字符串中传递 JSON。做网络的构造函数 I/O 无论如何也是一个非常糟糕的主意,因为它很慢并且在单元测试中很痛苦。
就是说,gson.fromJson
returns 一个 User
对象,但您永远不会对它做任何事情;它只是超出范围。
我会把代码改成这样:
public class User {
public String username;
public int id;
public String email;
public String role;
public String plan;
public String planEndDate;
public static User findByName(String username) throws IOException {
String json = downloadUserData(username);
return new Gson().fromJson(json, User.class);
}
public static String downloadUserData(String username) throws IOException {
URL url = new URL(urlhere);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)");
String response = ApiRequest.getResponse(connection);
connection.disconnect();
return response;
}
}
这样您仍然可以手动构建用户,或者如果必须的话从某个地方下载他们的数据。
User downloaded = User.findByName("me");
User json = new Gson().fromJson("{\"id\": 1, \"username\": \"me\", ... \"}", User.class);
User manually = new User();
manually.username = "me";
manually.email = "me@example.org";
// ...
我在使用 JSON 时遇到问题,我目前有这个 class 可以将来自我的 api 的 json 响应转换为一个对象,但它返回所有值空 -
public class User {
public String username;
public User(String username) throws IOException {
this.username = username;
URL url = new URL(urlhere);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)");
String response = ApiRequest.getResponse(connection);
connection.disconnect();
Gson gson = new Gson();
gson.fromJson(response, this.getClass());
}
public int id;
public String email;
public String role;
public String plan;
public String planEndDate;
}
我是 json 的新手,请记住这一点,我可能遗漏了什么。
JSON 响应示例:
{"id":7,"username":"xx","email":"xx","role":"administrator","plan":"xx","planEndDate":"xx"}
下次你应该读How To Ask and make sure your code is a Minimal Complete Verifiable Example。这里不需要整个网络访问,您可以只在字符串中传递 JSON。做网络的构造函数 I/O 无论如何也是一个非常糟糕的主意,因为它很慢并且在单元测试中很痛苦。
就是说,gson.fromJson
returns 一个 User
对象,但您永远不会对它做任何事情;它只是超出范围。
我会把代码改成这样:
public class User {
public String username;
public int id;
public String email;
public String role;
public String plan;
public String planEndDate;
public static User findByName(String username) throws IOException {
String json = downloadUserData(username);
return new Gson().fromJson(json, User.class);
}
public static String downloadUserData(String username) throws IOException {
URL url = new URL(urlhere);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)");
String response = ApiRequest.getResponse(connection);
connection.disconnect();
return response;
}
}
这样您仍然可以手动构建用户,或者如果必须的话从某个地方下载他们的数据。
User downloaded = User.findByName("me");
User json = new Gson().fromJson("{\"id\": 1, \"username\": \"me\", ... \"}", User.class);
User manually = new User();
manually.username = "me";
manually.email = "me@example.org";
// ...