2014-09-25 52 views
4

因此,我使用的這個api經常遇到包含一個數組或對象的字段的json,我不知道如何處理這個正確的方法。處理數組或對象的json字段?

什麼情況是,我在我的JSON數組是

  • 一個空數組,如果沒有條目
  • 對象的數組時,有一個以上的條目
  • 其實不是一個數組,但只有一個條目時有一個對象。

這裏是使事情更清晰的例子:

無:

{ 
    "what": "kittens", 
    "why": "I don't meow", 
    "kittens": [] 
} 

之一:

{ 
    "what": "kittens", 
    "why": "I don't meow", 
    "kittens": { 
     "name": "Ser Pounce", 
     "gender": "male" 
    } 
} 

很多:

{ 
    "what": "kittens", 
    "why": "I don't meow", 
    "kittens": [ 
     { 
      "name": "Ser Pounce", 
      "gender": "male" 
     }, 
     { 
      "name": "Mr. Snuffles", 
      "gender": "male" 
     } 
    ] 
} 

現在,如果這是情況並非如此,第二個例子看起來像這樣

{ 
    "what": "kittens", 
    "why": "I don't meow", 
    "kittens": [ 
     { 
      "name": "Ser Pounce", 
      "gender": "male" 
     } 
    ] 
} 

我可以只使用一個POJO

public class Kittens 
{ 
    public String what; 
    public String why; 
    public List<Kitten> kittens; 

    public static class Kitten 
    { 
     public String name; 
     public String gender; 
    } 
} 

,然後反序列化一切的標準方式:

Kittens kittens = objectMapper.readValue(good_kitten, Kittens.class); 

所以另一種方法是使用樹模型並手動進行大量類型檢查(使用JsonNode.isArray()等)

這不會是可行的,但因爲會有大量的開銷,它不會是優雅和我提到也有一些嵌套的事情,當然:

{ 
    "what": "kittens", 
    "why": "I don't meow", 
    "kittens": [ 
     { 
      "name": "Ser Pounce", 
      "gender": "male", 
      "kittens": [] 
     }, 
     { 
      "name": "Mr. Snuffles", 
      "gender": "male", 
      "kittens": { 
       "name": "Waffles", 
       "gender": "female", 
       "kittens": [ 
        { 
         "name": "Mittens", 
         "gender": "male", 
         "kittens": [] 
        }, 
        { 
         "name": "Winston", 
         "gender": "male", 
         "kittens": { 
          "name": "Fiona", 
          "gender": "female", 
          "kittens": [] 
         } 
        } 
       ] 
      } 
     } 
    ] 
} 

現在我真的要定義類似下面的模型,並用它

public class NestedKittens 
{ 
    public String what; 
    public String why; 
    public List<Kitten> kittens; 

    public static class Kitten 
    { 
     public String name; 
     public String gender; 
     public List<Kitten> kittens; 
    } 
} 

但是這不會工作完成,因爲在JSON有普通老式小貓對象裏應該有List<Kitten>

那麼,是否有任何註釋或配置可用,使jackson從Kitten自動轉換爲List<Kitten>時它需要?

回答

3

該解決方案被證明是非常簡單的:

objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);