2016-11-09 10 views
2

値の1つがISO-8601 datetime stringであるJSONがあります。 java.util.Dateに変換する必要があります。どうすればいいのですか?JSONを読み取り、Map <String、Object>に変換します

次のコードが正しいかどうかわかりません。

import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 

import java.text.SimpleDateFormat; 
import java.util.Map; 

public class CustomObjectMapper extends ObjectMapper { 

    private static final long serialVersionUID = 2686298573056737140L; 
    private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 


    public CustomObjectMapper() { 
     super.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 
     super.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
     super.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
     super.setDateFormat(df); 
    } 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = new CustomObjectMapper(); 
     Map<String, Object> map = mapper.readValue(JSON, new TypeReference<Map<String, Object>>(){}); 
     System.out.println(map); 
     for(String key: map.keySet()) { 
      Object val = map.get(key); 
      System.out.println("keyName is " + key + " value is " + val + " value type is " + val.getClass()); 

     } 
    } 


    private static final String JSON = "{\"mybool\":true,\"mydate\":\"2016-02-11T18:30:00.511-08:00\",\"mystring\":\"test\",\"myint\":1234}"; 


} 

マップの内容を印刷すると、「mydate」の値が文字列として表示されていることがわかります。

key is mybool value is true value type is class java.lang.Boolean 
key is mydate value is 2016-02-11T18:30:00.511-08:00 value type is class java.lang.String 
key is mystring value is test value type is class java.lang.String 
key is myint value is 1234 value type is class java.lang.Integer 

キー「mydate」の値の型がjava.util.DateのどこにあるかをJacksonで設定できますか?

+1

私はあなたがマップに読んでいる場合、どの値が日付かを指定する方法がないと思う。 – chomnoue

答えて

1

いいえできません。 JSON形式には日付データ型がありません。これはStringのみにすることができます。したがって、java.util.Dateを自分で解析する必要があります。

new java.util.Date(javax.xml.bind.DatatypeConverter.parseDateTime(val).getTimeInMillis()); 
2

をあなたは、あなたがそのプロパティをマッピングするためのPOJOを持っているし、次のように(ジャクソン2.0から入手可能)@JsonFormatアノテーションを使用することができますJSONの構造を知っていると仮定すると::

import com.fasterxml.jackson.annotation.JsonFormat 

class MyPojo { 

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") 
    Date mydate 

    String mystring 
    Boolean mybool 
    Integer myint  
} 

使って、例として あなたのマッパークラスで:

MyPojo myPojo = mapper.readValue(JSON, MyPojo.class); 
+0

残念ながら、jsonはMap から構築されていますが、jsonはanyである可能性があるため、jsonの内容は所有していません(json)。 – serverfaces

+0

その場合、あまりできないことはありませんか?最初にJSONコンテンツがわからない場合は、なぜStringをDateとして必要とするのだろうかと思います。私が考えることができるのは、マップ上で反復して値がStringインスタンスであるかどうかをチェックし、ISO-8601パターン(regexを使用している)と一致するかどうかをチェックし、文字列をDateオブジェクトとして解析します。 – dic19

+0

私はMap をループして終了し、変換を行うためにISO 8601に一致する値を探しました。 – serverfaces