2016-05-19 5 views
0

私はパートナーのWebサービスからJSONデータを消費するためにJacksonとJava Springを使用していますが、克服するのに苦労しています。問題は、私が消費する必要があるデータに、特定のタイプの要素が1つだけ含まれている場合があります。データにはこれらの要素のリストが含まれていることがあります(ここで正しいJSON用語を使用していない場合はご容赦ください)。例:JSON要素が単一からリストに変更される

{ 
"number": "12121212", 
"activity": { "status": "in transit", "date": "20100429" } 
} 

これには、1つの "activity"要素が含まれています。その後、次の例では、「アクティビティ」要素のリストがあります:

{ 
"number": "12121212", 
"activity": [{ "status": "arrived", "date": "20160430" }, { "status": "in transit", "date": "20160429" }, { "status": "shipping", "date": "20160429"}] 
} 

私は、Java BeanにJSONをマップするためにcom.fasterxml.jackson.databind.ObjectMapperを使用して、そしてここで私の2つですよ豆:

public class Activity { 
    private String status; 
    private String date; 

    /* getters and setters */ 
} 

public class Message { 
    private String number; 
    private Activity activity; 

    /* getters and setters */ 
} 

そして、私の呼び出し元のコードはこれです:シングル「アクティビティ」要素にJSONメッセージを受信して​​いる間、私はこのコードを実行すると

public static void main(String[] args) { 
    Messages m = new Messages(); 
    String jsonMessage = getJsonMessage();  // This gets the JSON message to be run through ObjectMapper 
    ObjectMapper mapper = new ObjectMapper(); 

    try { 
     Message message = mapper.readValue(jsonMessage, Message.class); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} // end method main() 

は、それが動作します。 「アクティビティ」要素のリストでそれを実行すると、私は次のエラーを取得する:「アクティビティ」要素のリストを使用する際は、次へのメッセージBeanを変更

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.graybar.utilities.parsejson.Activity out of START_ARRAY token 

は、コードの作業を行います

public class Message { 
    private String number; 
    private ArrayList<Activity> activity; 

    /* getters and setters */ 
} 

ただし、コードは単一の「アクティビティ」要素では機能しません。私は次のエラーを取得する:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 

私は、単一の処理するための簡単な方法か、ジャクソンの枠組み内の要素のインスタンスのリストがあります想像する必要がありますが、残念ながら、私はそれを見つけることができていませんでした。

ご協力いただきましてありがとうございます。

-Stephenスポルディング

+1

http://stackoverflow.com/questions/37164399/jackson-desrialize-私は、呼び出し元のメソッドに次のコード行を追加しましたwhen-jsonproperty-is-array-a-a-single-o/37175527#37175527 – varren

答えて

1

@varrenは、上記のリンクは私が解決策を見つける助けて。

mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 

ので、完全な方法は、次のようになります:

public static void main(String[] args) { 
    Messages m = new Messages(); 
    String jsonMessage = getJsonMessage();  // This gets the JSON message to be run through ObjectMapper 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); /* this is the fix */ 

    try { 
     Message message = mapper.readValue(jsonMessage, Message.class); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} // end method main() 
関連する問題