当前位置: 首页 > 知识库问答 >
问题:

解析Json到包含对象的对象

韩祯
2023-03-14

我从accuweather获得了以下带有json的代码

{  
 "Headline":{  
      "EffectiveDate":"2019-07-29T07:00:00+06:00",
      "EffectiveEpochDate":1564362000,
      "Severity":3,
      "Text":"The heat wave will continue through Friday",
      "Category":"heat",
      "EndDate":"2019-08-02T19:00:00+06:00",
      "EndEpochDate":1564750800
   },
   "DailyForecasts":[  
      {  
         "Date":"2019-07-29T07:00:00+06:00",
         "EpochDate":1564362000,
         "Temperature":{  
            "Minimum":{  
               "Value":19.1,
               "Unit":"C",
               "UnitType":17
            },
            "Maximum":{  
               "Value":36.7,
               "Unit":"C",
               "UnitType":17
            }
         },
         "Day":{  
            "Icon":30,
            "IconPhrase":"Hot",
            "HasPrecipitation":false
         },
         "Night":{  
            "Icon":35,
            "IconPhrase":"Partly cloudy",
            "HasPrecipitation":false
         },
         "Sources":[  
            "AccuWeather"
         ]
      }
   ]
}

我尝试通过Jackson将此对象解析为POJO

public static void main( String[] args )
{
    String x = "{\"Headline\":{\"EffectiveDate\":\"2019-07-29T07:00:00+06:00\",\"EffectiveEpochDate\":1564362000,\"Severity\":3,\"Text\":\"The heat wave will continue through Friday\",\"Category\":\"heat\",\"EndDate\":\"2019-08-02T19:00:00+06:00\",\"EndEpochDate\":1564750800},\"DailyForecasts\":[{\"Date\":\"2019-07-29T07:00:00+06:00\",\"EpochDate\":1564362000,\"Temperature\":{\"Minimum\":{\"Value\":19.1,\"Unit\":\"C\",\"UnitType\":17},\"Maximum\":{\"Value\":36.7,\"Unit\":\"C\",\"UnitType\":17}},\"Day\":{\"Icon\":30,\"IconPhrase\":\"Hot\",\"HasPrecipitation\":false},\"Night\":{\"Icon\":35,\"IconPhrase\":\"Partly cloudy\",\"HasPrecipitation\":false},\"Sources\":[\"AccuWeather\"]}]}";
    ObjectMapper objectMapper = new ObjectMapper();

    try {
        Weather weather = objectMapper.readValue(x, Weather.class);

        System.out.println(weather);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我有json中指定的所有模型,如标题每日预测数组、温度,由温度项组成(在json中命名为最小值和最大值)等,它们都有私有字段和公共构造函数、getter和setter。但是我没有一些字段,因为我想省略它们(Day、night、EpochDate、Source)。

当我运行程序时,我得到了错误

com.fasterxml.jackson.databind.exc.无法构造test.models.weather.Weather的实例(不存在Creator,如默认构造):无法从Object值反序列化(没有基于委托或属性的Creator)

我也尝试过Gson但它返回空值的对象

我做错什么了吗?还有别的方法吗?

编辑:这些是模型,@LazerBass是对的,因为我首先没有包括默认构造函数,现在错误已经改变了:

com.fasterxml.jackson.databind.exc.无法识别的属性:无法识别的字段标题(类test.models.weather.天气),未标记为可忽略(2个已知属性:标题,每日预测)

public class TemperatureItem {
    public double value;
    public String unit;
    public String unitType;

    public TemperatureItem() {

    }

    //Getters and setters
}


public class Temperature {
    private TemperatureItem maximum;
    private TemperatureItem minimum;

    public Temperature(TemperatureItem maximum, TemperatureItem minimum) {
        this.maximum = maximum;
        this.minimum = minimum;
    }

    public Temperature() {

    }
    //Getters and setters
}

public class DailyForecasts {
    private LocalDateTime date;
    private Temperature temperature;

    public DailyForecasts(LocalDateTime date, Temperature temperature) {
        this.date = date;
        this.temperature = temperature;
    }

    public DailyForecasts() {

    }
    //Getters and setters
}

public class Headline {
    private LocalDateTime effectiveDate;
    private int severity;
    private String text;
    private String category;
    private LocalDateTime endDate;

    public Headline() {

    }

    public Headline(LocalDateTime effectiveDate, Integer severity, String text, String category, LocalDateTime endDate) {
        this.effectiveDate = effectiveDate;
        this.severity = severity;
        this.text = text;
        this.category = category;
        this.endDate = endDate;
    }
    //Getters and setters
}

public class Weather {
        private Headline headline;
        private DailyForecasts[] dailyForecasts;

        public Weather() {

        }
        public Weather(Headline headline, DailyForecasts[] dailyForecasts) {
            this.headline = headline;
            this.dailyForecasts = dailyForecasts;
        }
        //Getters and setters
}

我发现,如果我将json字符串转换为小写,我可以得到一些值,尽管没有解析数组和LocalDateTime

共有3个答案

顾炎彬
2023-03-14

从异常消息判断,我猜您的Weather类使用的是无参数构造函数。尝试添加一个。例如。

public class Weather {
    public Weather() {
        // no arg constructor needed for jackson
    }
}
陈兴朝
2023-03-14

Jackson失败并带有诸如“no Creator,如默认构造,存在”之类的消息时,它需要默认的public无参数构造函数为每个POJO您在模型中拥有的类。

当它失败时,如“无法识别的字段...未标记为可忽略...”您需要禁用FAIL_ON_UNKNOWN_PROPERTIES功能。

另请参见:

  1. Jackson解组具有未知属性的JSON
  2. 杰克逊延迟反序列化字段
经清野
2023-03-14

要生成Weather类及其相应的类,请使用以下链接并选择源类型为json。它将根据json字符串生成所需的类。

http://www.jsonschema2pojo.org/

生成类后,可以使用@JsonIgnore注释不需要的字段。

 类似资料:
  • 我有一个任务解析Json到Java类。 我试图解析的Json片段有点像树结构。 这里的关键点是,参数值可以是字符串,也可以是参数名称/值对的另一个数组; 我想用杰克逊地图绘制器 这里的问题是我不知道如何在这里描述响应类,所以它可以被杰克逊自动解析。如果有可能的话。 Json:

  • 我正在尝试用Python加载和解析一个JSON文件。但我无法加载文件: 收益率:

  • 问题内容: 我无法理解如何使用Visual .NET将JSON字符串解析为c#对象。任务很简单,但是我仍然迷路…我得到了这个字符串: 这是我尝试进行消毒的代码: 我不知道在’<’和’>’之间放置什么,从网上阅读的内容中,我必须为其创建一个新的类。另外,如何获得输出?一个例子会有所帮助! 问题答案: 创建一个可以反序列化您的JSON的新类,例如:

  • 问题内容: 我收到的JSON对象为: 它打印: 但现在我无法读取其中的任何内容。我如何获得“电子邮件”字段? 谢谢 问题答案: 您应该按照以下方式进行操作: 如果我没错的话。

  • 问题内容: 我试图从JSON数组中获取每个JSON对象。我通过HTTP发布获得此数据。 我知道我的数据是什么样的: 我的示例代码和结构如下所示: 我不确定如何遍历JSON数组并获取JSON对象,然后仅使用JSON对象。 问题答案: 试试这个作为您的结构, 您的名称不正确,顶层名称也不正确。解码为a之后,您可以遍历切片以获取每个切片

  • 问题内容: 我试图显示基于JSON数据的“排行榜”表。 我已经阅读了很多有关JSON格式的文章,并克服了一些最初的障碍,但是我的Javascript知识非常有限,需要帮助! 基本上,我的JSON数据是通过如下形式获得的: 我需要的是能够遍历此数组,为每个对象生成一个表行或列表项。数组中的对象总数未知,但是每个对象具有相同的格式-三个值:名称,得分,团队。 到目前为止,我已经使用了以下代码,该代码确