java - JsonMappingException:无法在 androidstudio 中构造 ...rest API 的实例
问题描述
我正在尝试在 android 应用程序中实现全局磁铁 API 。我做了一个休息 API 获取请求并将 json API 数据放入一个string
(这个字符串被称为dataString
。这个字符串看起来像这样:
{
declination: {
units: "Deg",
value: -4.8235602378845215
},
inclination: {
units: "Deg",
value: -30.085556030273438
},
total_intensity: {
units: "nT",
value: 31945.123046875
}
}
我现在正在尝试将此字符串反序列化为一个对象。我做了以下课程:
public class MagneticData {
@JsonProperty("declination")
public MagneticDataElement declination;
@JsonProperty("grid_variation")
public MagneticDataElement grid_variation;
@JsonProperty("inclination")
public MagneticDataElement inclination;
@JsonProperty("total_intensity")
public MagneticDataElement total_intensity;
}
public class MagneticDataElement {
@JsonProperty("units")
public String units;
@JsonProperty("value")
public double value;
}
我现在使用该ObjectMapper.readValue()
函数将 转换为该dataString
类型的对象,MagneticData
但出现以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.mobcom.apitest.MainActivity$MagneticData: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
我究竟做错了什么?
解决方案
我正在使用杰克逊 2.8.5 版:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.5'
implementation 'com.fasterxml.jackson.core:jackson-core:2.8.5'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.5'
这是我的完整代码:
public class MainActivity extends AppCompatActivity {
Button click;
TextView data;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"units",
"value"
})
public class MagneticData {
@JsonProperty("declination")
public MagneticDataElement declination;
@JsonProperty("grid_variation")
public MagneticDataElement grid_variation;
@JsonProperty("inclination")
public MagneticDataElement inclination;
@JsonProperty("total_intensity")
public MagneticDataElement total_intensity;
MagneticData(MagneticDataElement d, MagneticDataElement g, MagneticDataElement i, MagneticDataElement t) {
declination = d;
grid_variation = g;
inclination = i;
total_intensity = t;
}
}
public class MagneticDataElement {
@JsonProperty("units")
public String units;
@JsonProperty("value")
public double value;
MagneticDataElement(String u, double v) {
units = u;
value = v;
}
}
public void deserialize(String str) throws IOException {
//data.setText(jsonNode.get("total_intensity").textValue());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
click = findViewById(R.id.button);
data = findViewById(R.id.fetchedData);
click.setOnClickListener(new View.OnClickListener() {
String dataString = "";
@Override
public void onClick(View v) {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
double altitude = 0;
double latitude = 0;
double longitude = 0;
double year = 2019;
URL url = null;
try {
url = new URL("https://globalmagnet.amentum.space/api/calculate_magnetic_field?altitude="+altitude+"&latitude="+latitude+"&longitude="+longitude+"&year="+year);
HttpsURLConnection myConnection = (HttpsURLConnection) url.openConnection();
myConnection.setRequestMethod("GET");
myConnection.setRequestProperty("Accept", "application/json");
if (myConnection.getResponseCode() == 200) {
Log.e("TYPE", myConnection.getContentType());
Log.e("Content", String.valueOf(myConnection.getInputStream()));
InputStream inputStream = myConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while (line != null) {
line = bufferedReader.readLine();
dataString = dataString + line;
}
Log.e("DATA", dataString);
MagneticData magneticData = new ObjectMapper().readValue(dataString, MagneticData.class);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
} else {
Log.e("ERROR", String.valueOf(myConnection.getResponseCode()));
Log.e("ERROR", myConnection.getResponseMessage());
Log.e("ERROR", String.valueOf(myConnection.getHeaderField("altitude")));
}
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
});
}
});
}
}
推荐阅读
- android - Android 房间迁移策略
- javascript - Javascript 变量没有按应有的方式添加值
- javascript - ReferenceError:未定义按钮
- java - JavaFX 应用程序无法启动(使用 JDK11 的 MacOS)
- php - 在 PHP 中设置标题后无法访问此站点/404 状态代码
- javascript - 将自定义标头添加到 $http
- javascript - 特殊字符的替换功能
- javascript - firebase 云函数 aync/await 返回 undefined 导致函数崩溃
- python - 使用重写方法中的逻辑从方法返回的 Pythonic 方式
- office-js - 如何处理神秘人物?