Analizar ASP.NET MVC devolvió la fecha utilizando la biblioteca Jackson JSON en Java
Estoy analizando JSON del servidor en mi aplicación de Android usando la biblioteca de Jackson JSON. Sin embargo, las solicitudes de análisis fallan cuando recibo DateTime ya que está en este formato:
"/Date(1277931782420)/"
Sé que debo hacer algo como:
- Múltiples archivos dex - La conversión a formato Dalvik falló - No se puede ejecutar dex
- Smack 4.1 No hay respuesta dentro del tiempo de espera de respuesta
- ¿Cómo puedo interceptar pulsaciones de botón en el auricular en Android?
- ¿Cómo se hacen los widgets personalizados?
- Desempeño de Android: "Evita los internos y los setters"
ObjectMapper om = new ObjectMapper(); om.setDateFormat(new TicksSinceFormat());
Pero no tengo ni idea de si puedo usar SimpleDateFormat en absoluto (¿y qué formato de cadena usaría?) O necesito escribir mi propio parser DateFormat. Por lo tanto, me gustaría seriamente si alguien podría ayudar con el ejemplo de código.
EDIT: OK, vea mi respuesta para el código completo.
- Ejecución de pruebas de Junit de Android desde la línea de comandos
- Falta gradlew en el proyecto generado de android
- Fuentes personalizadas y diseños XML (Android)
- ¿Cómo cambiar el tamaño de la fuente y el color de la fuente de un archivo Java?
- Java.lang.IllegalArgumentException: El observador es nulo
- Obtener un actor por nombre en libgdx
- Resolver Etiqueta de aplicación para cada tipo de compilación
- Cómo utilizar un carácter como un separador en una cadena
Esto resultó ser más difícil de lo que esperaba:
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 } }
El uso de la clase es entonces extremadamente simple, solo haz lo siguiente:
ObjectMapper om = new ObjectMapper(); om.setDateFormat(new TicksSinceFormat())
Supongo que esto se puede codificar mejor + que voy a necesitar para hacer frente a las diferencias cuando se trata de. NET Ticks VS Java ticks – pero por ahora esto va a hacer. Si alguien tiene una mejor solución o más información sobre los problemas mencionados voy a tratar con más tarde – no dude en publicar y voy a marcar su respuesta como correcta si es mejor.
EDIT: Como he explicado en esta pregunta y respuesta he cambiado a la biblioteca ServiceStack.Text en el servidor y devuelve diferente, formato ISO8601. Para ese formato estoy usando un parsing ligeramente diferente (ya que Jackson tiene problemas para analizar ISO8601 que contiene milisegundos). Por supuesto, al igual que con otro código que estoy publicando – hágamelo saber si tiene una mejor versión (sólo por favor, el código postal / editar este post, en lugar de recurrir a la retórica filosófica sobre cómo debe hacerse):
@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(); } }
Puedo estar equivocado sobre esto, ya que no he llegado muy lejos en el desarrollo de Android, pero el formato que presentó:
"/Date(1277931782420)/"
Aparece ser el tiempo de la época de Unix.
Si ese es el caso, no desea / necesita utilizar SimpleDateFormat
. En su lugar, intente crear un Long
de él y pasar al constructor Date
, teniendo en cuenta si se trata de segundos o milisegundos basado en el valor de época.
Aquí hay una publicación StackOverflow que proporciona el código para hacerlo: https://stackoverflow.com/a/535017/463196
- Tabulaciones en la sección principal de ActionBar
- Parsing JSON de los mapas google DistanceMatrix api en android