5

Jackson JSON ライブラリを使用して、Android アプリケーションでサーバーから JSON を解析しています。ただし、次の形式であるため、DateTime を受け取るたびにリクエストの解析が失敗します。

"/Date(1277931782420)/"

私は次のようなことをする必要があることを知っています:

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

しかし、SimpleDateFormat を使用できるかどうか (そして、どのフォーマット文字列を使用するか) がまったくわからないか、独自の DateFormat パーサーを作成する必要があります。ですから、誰かがコード例を手伝ってくれたら本当にありがたいです。

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

4

2 に答える 2

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 に関しては違いに対処する必要がありますが、今のところはこれで十分です。誰かがより良い解決策を持っているか、言及された問題についてより多くの洞察を持っている場合は、後で対処します-お気軽に投稿してください。より良い場合は、あなたの答えを正しいものとしてマークします.

編集: この質問と回答で説明したように、サーバー上の 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();
    }
}
于 2013-02-16T05:32:43.067 に答える
3

私は Android の開発にあまり慣れていないので、これについては間違っているかもしれませんが、あなたが提示した形式は次のとおりです。

"/Date(1277931782420)/"

Unix エポック時間のようです。

その場合は、を使用したくない/使用する必要はありませんSimpleDateFormat。代わりに、それが秒ベースかミリ秒ベースかを考慮しLongて、そこから を作成し、コンストラクターに渡してみてください。Date

そのためのコードを提供する StackOverflow の投稿は次のとおりです: https://stackoverflow.com/a/535017/463196

于 2013-02-16T04:41:55.777 に答える