【问题标题】:(Deserializing) Complex JSON to Java objet(List) with Jackson(反序列化)复杂的 JSON 到 Java 对象(列表)与 Jackson
【发布时间】:2021-12-21 02:06:02
【问题描述】:

我在 Json 中是全新的,我正在尝试反序列化具有复杂类型的复杂 Json(所有这些元素都是我程序中的类:entete、pied-depage、corps(List), nomain、labels、lieu、garantie、Elt)。我尝试将此 JSON 反序列化为来自类型类 Tester 的列表。

[{
"entete":{
    "titre" :,  "Nummer" : , 
    … }
"pied-depage":{
    "utilisateur" : "martin"
    … }
"Corps":[{
 "reservation" : 0.00,
    
    "garantie" : [ ],
    "Utilisateurs" : [ ],

           …}
…}]
"nomain": $
"daterRange": {}
"labels":{}
"date1" : "1988-01-01",
"date2" : "1528-12-31"
}]
class Tester {
    private entete header =  entete.getHeader();
    private pied-depage footer = pied-depage.getFooter(); 
    private List<Elt> Corps;
    private Elt anlagengut;
    private String nomain;
    private LocalDateRange dateRange;
    
    public LocalDate getDate1() {
      return this.dateRange.getStart();
    }
    
    public LocalDate getDate2() {
      return this.dateRange.getEndInclusive();
    }
    
    // getter ...
    
    public static List<Tester> getCollection() throws IOException {  
      ObjectMapper mapper = new ObjectMapper();
      
      mapper.registerModules( new JavaTimeModule());
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false)
        .findAndRegisterModules();
      
      List<Tester>  tester = (List<Tester>) mapper.readValue(Paths.get("Tester.json").toFile(), List.class);
      return tester;
    }
}

我在用 Jackson 序列化同一个对象之后尝试反序列化生成的 JSON 以在另一个程序中拥有相同的容器。你对我有什么暗示吗?我已经写了这些,但是我得到了一个带有 LinkedHashMap 类型元素的对象。

【问题讨论】:

  • 据我了解,这不是真正的代码:private pied-depage footer = pied-depage.getFooter();,对吧?您能否提供工作代码。无论如何,为了匹配 JSON,该字段声明应该更改为 private Object piedDepage

标签: java json jackson-databind localdate


【解决方案1】:
[{
“ entete“:{
    "titre" :,  "Nummer" : , 
    … }
“ pied-depage“:{
    "utilisateur" : "martin"
    … }
“ Corps“:[{
 "reservation" : 0.00,
    
    "garantie" : [ ],
    "Utilisateurs" : [ ],

           …}
…}]
“ nomain“: $
“ daterRange“: {}
“ labels“:{}
"date1" : "1988-01-01",
"date2" : "1528-12-31"
}]
``` 

请参阅下面的参考:

当你看到 { } 时,你可以创建一个类来映射属性,也可以使用 Map

当您看到[{}] 时,您可以使用List&lt;YourCustomClass&gt;List&lt;Map&lt;String, String&gt;&gt;

如果您想将您的类属性映射到具有不同案例/名称的 JSON 属性,请使用 @JsonProperty("YourWeirdPropertyNameHere")

映射属性时,

entete“:{
    "titre" :,  "Nummer" : , 
    … }

然后类表示将如下所示:

public class Entete {

 private String titre;     //String because the value is "Number" which is in ""

}

对于

“ Corps“:[{
     "reservation" : 0.00,
        
        "garantie" : [ ],
        "Utilisateurs" : [ ],
    
               …}
    …}]

然后类表示将如下所示:

public class Corp{
   
  private Double reservation;
  private List<String> garantie;

  @JsonProperty("Utilisateurs")
  private List<String> utilisateurs;

}

然后就可以创建映射器类Test了:

public class Test{

  public Entete entete;

  @JsonProperty("pied-depage")
  public PiedDepage piedDepage;

  @JsonProperty("Corps")
  public List<Corp> corps;
 
   
}

而要使用ObjectMapper,你需要传递TypeReference:

List<Test> myTests = mapper.readValue(jsonInput, new TypeReference<List<Test>>(){});

【讨论】:

  • 感谢@susan,我已经尝试过使用注释,但我无法使用与 bean Tester 中相同类型的变量反序列化我的对象,并且 LocalDate 仍然是 String 而不是 LocalDate 类型
  • 我对你@boris 的建议是从小处着手。从您的 JSON 中删除所有内容,但请继续尝试。如果可行,请将下一个元素添加到您的 JSON。你在某个地方有问题.....
  • 好的 susan,我马上测试一下,对不起,你有关于 LocalDate 的想法吗,即使我使用 JavaTimeModule 我没有得到任何具有 LocalDate 类型的日期反序列化?
  • @boris 我的建议是先一次取 1 个元素 :) 关于 LocalDate,请参阅 stackoverflow.com/questions/28802544/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多