2013-02-16 3 views
5

私はAndroidアプリケーションのサーバーからJSONライブラリを使用してJSONを解析しています。しかし、それはこの形式でだから、私は日時を受信するたびに要求が失敗の解析:JavaでJackson JSONライブラリを使用してASP.NET MVCが返された日付

"/Date(1277931782420)/" 

私はのような何かを行う必要があります知っている:

ObjectMapper om = new ObjectMapper(); 
om.setDateFormat(new TicksSinceFormat()); 

しかし、私はまったくのSimpleDateFormatを使用することができる場合、私は(見当がつかないどの形式の文字列を使用するのですか?)、または独自のDateFormatパーサーを記述する必要があります。だから、誰かがコード例を手伝ってくれたら本当に感謝しています。

編集: OK、完全なコードは私の答えを参照してください。

答えて

5

これは厳しいであることが判明した後、私が期待される:クラスを使用して

public class TicksSinceFormat extends DateFormat { 
    @Override 
    public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) { 
     long millis = date.getTime(); 

     return new StringBuffer("/Date(" + millis + ")/"); 
    } 

    @Override 
    public Date parse(String string, ParsePosition position) { 
     int start = string.indexOf("(") + 1; 
     int end = string.indexOf(")"); 

     String ms = string.substring(start, end); 
     Date date = new Date(Long.parseLong(ms)); 

     position.setIndex(string.length() - 1); // MUST SET THIS 
     return date; 
    } 

    @Override 
    public Object clone() { 
     return new TicksSinceFormat(); // MUST SET THIS 
    } 
} 

はただやる、そして非常に簡単です:

ObjectMapper om = new ObjectMapper(); 
om.setDateFormat(new TicksSinceFormat()) 

これはコードを改善することができる+私は.NET Ticks VS Java ticksに関しては違いを扱う必要があると推測していますが、 o。誰かがより良い解決策を持っているか、上記の問題についてのより詳細な洞察があれば、私は後で対処します。投稿を自由にしてください。

EDIT:これで説明したように、question & answer私はサーバーのServiceStack.Textライブラリに切り替えました。これは異なるISO8601形式を返します。このフォーマットでは、少し異なる構文解析を使用しています(JacksonはISO8601の解析に問題があり、ミリ秒が含まれています)。私が投稿してる他のコードと同じようにもちろん、 - あなたはより良いバージョンを持っているなら、私に知らせて(ただ、むしろそれが行われるべきかについて哲学的なレトリックに頼るよりも、この投稿を編集/コードを投稿してください):

@SuppressLint("SimpleDateFormat") 
public class JacksonSimpleDateFormat extends SimpleDateFormat { 
    public JacksonSimpleDateFormat() { 
     if (mParser == null) { 
      mParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
      mParser.setTimeZone(TimeZone.getTimeZone("UTC")); 
     } 
    } 

    @Override 
    public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) { 
     return mParser.format(date, buffer, field); 
    } 

    private static SimpleDateFormat mParser; 
    @Override 
    public Date parse(String string, ParsePosition position) { 
     String str = string.split("\\.")[0]; 

     Date date = null; 
     try { 
      date = mParser.parse(str); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     position.setIndex(string.length() - 1); 
     return date; 
    } 

    @Override 
    public Object clone() { 
     return new JacksonSimpleDateFormat(); 
    } 
} 
+1

あなたのコードは正常に動作するはずです...私が行う唯一の変更は、 'parse'メソッド、string.indexOf/string.substringの代わりに。これは単なるスタイルです...私はいつもstring.indexOf/substringがインデックス/長さに関して働くにはやや脆弱で扱いにくいことを発見しました。ちょうど私の謙虚な意見。 –

+0

@PhilipTenn確かに動作する堅牢な正規表現とコードを私に提供するように気をつけますか? – kape123

3

私はAndroidの開発に非常に遠くもらっていない、しかし、あなたが提示形式として、私は、この上で間違っている可能性があります

"/Date(1277931782420)/" 

はUnixエポック時間であるように思われます。

この場合、SimpleDateFormatを使用する必要はありません。代わりにLongを作成してDateコンストラクタに渡し、秒またはミリ秒単位のエポック値かどうかを考慮してください。ここで

は、そのためのコードを提供StackOverflowのポストです:https://stackoverflow.com/a/535017/463196

+0

リンクに感謝 - 私はこれに取り組んでいますが、いくつかの予期しない問題があります(編集を参照してください) – kape123

関連する問題