我正在研究一个基本的JSON问题: 我采用JSON格式的字符串(来自http://api.open-notify.org/iss-now.json)。 我将它传递给一个方法,该方法试图将信息解析为一个名为ISSClass的类,以便我可以读取经度和纬度的字段。
当我尝试返回两个字段时,它们为空。
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
public class GetWeather
{
public String getISSInfo(String json)
{
String output="";
Gson gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
ISSClass cond=new ISSClass();
cond= gson.fromJson(json, ISSClass.class);
output+="The ISS is at: "+cond.toString();
return output;
}
class ISSClass
{
public ISSClass(){}
@Expose
public String latitude;
@Expose
public String longitude;
public String toString()
{
return latitude+", "+longitude;
}
public void setLongitude(String lon)
{
longitude=lon;
}
public void setLatitude(String lat)
{
latitude=lat;
}
public String getLongitude()
{
return longitude;
}
public String getLatitude()
{
return latitude;
}
}
}
这是主要的:
public class GsonTester
{
public static void main(String[] args) throws Exception
{
JsonReader reader=new JsonReader();
String toParse="{\"message\": \"success\", \"timestamp\": 1501887780, \"iss_position\": {\"latitude\": \"-35.5370\", \"longitude\": \"-178.7080\"}}";
GetWeather weather=new GetWeather();
System.out.println(weather.getISSInfo(toParse));
}
}
我尝试过使用@SerializedName(“经度”)没有运气。 与实例化'gson'相同 Gson gson = new Gson(); 我正在为gson使用gson-2.8.1.jar。
希望我错过了一些明显的东西。
答案 0 :(得分:1)
它不起作用,因为longitude
和latitude
位于iss_position
嵌套对象中,而unmarshaller尝试从顶层解析字段。
解决它以创建JsonParser并提取嵌套字段值(iss_position
)并解组它的最简单方法。
public String getISSInfo(String json) {
String output = "";
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
JsonParser parser = new JsonParser();
JsonObject top = parser.parse(json).getAsJsonObject();
String nested = top.get("iss_position").toString();
ISSClass cond = gson.fromJson(nested, ISSClass.class);
output += "The ISS is at: " + cond.toString();
return output;
}