【问题标题】:JsonMappingException: Can not construct instance of... rest API in androidstudio [duplicate]JsonMappingException:无法在androidstudio中构造...rest API的实例[重复]
【发布时间】:2020-03-27 09:51:39
【问题描述】:

我正在尝试在 android 应用程序中实现 global magnet API。我做了一个rest API get请求并将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?)

我做错了什么?

【问题讨论】:

  • 您能否展示您的 POJO 类,就像您在项目中真正拥有它们一样:包含所有 getter、setter 和构造函数?异常消息非常清楚:missing default constructor or creator, or perhaps need to add/enable type information? 表示您没有任何公共非参数构造函数,或任何其他可以轻松映射到 JSON 的构造函数。
  • 您的 dataString 不是有效的 JSON 字符串,因为所有键都必须用双引号括起来,如果变量名和键名,您不必在每个字段中添加 @JsonProperty JSON 对象的数量是相同的。

标签: java json android-studio jackson


【解决方案1】:

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

            }
        });



    }
}

【讨论】:

    【解决方案2】:

    我使用修改后的 JSON 字符串测试了您的代码,并将 toString() 添加到您的 POJO,一切正常,如下所示,因此您可能需要提供更多调试信息,例如您如何反序列化它以及哪个版本的 Jackson 库你用过。

    修改后的 JSON 字符串

    {
      "declination": {
        "units": "Deg",
        "value": -4.8235602378845215
      },
      "inclination": {
        "units": "Deg",
        "value": -30.085556030273438
      },
      "total_intensity": {
        "units": "nT",
        "value": 31945.123046875
      }
    }
    

    代码 sn-p

    ObjectMapper mapper = new ObjectMapper();
    MagneticData magneticData = mapper.readValue(jsonStr, MagneticData.class);
    System.out.println(magneticData.toString());
    

    控制台输出

    MagneticData [declination=MagneticDataElement [units=Deg, value=-4.8235602378845215], inclination=MagneticDataElement [units=Deg, value=-30.085556030273438], total_intensity=MagneticDataElement [units=nT, value=31945.123046875]]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 2020-04-21
      • 1970-01-01
      • 2012-09-26
      • 2021-07-17
      相关资源
      最近更新 更多