首页 > 解决方案 > 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?)

我究竟做错了什么?

标签: javajsonandroid-studiojackson

解决方案


我正在使用杰克逊 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();
                        }
                    }
                });

            }
        });



    }
}


推荐阅读