2013-02-16 36 views
5

'daki Jackson JSON kitaplığını kullanarak döndürdü. JSON kütüphanesini kullanarak JSUS'u Android uygulamasında sunucudan ayrıştırıyorum.Ayrıştırma ASP.NET MVC, Java

"/Date(1277931782420)/" 

ben böyle bir şey yapması gerektiğini biliyorum:: Ancak, ayrıştırma istekleri öyle beri bu formatta DateTime aldığınızda başarısız

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

Ama (hiç SimpleDateFormat kullanabilirsiniz eğer hiçbir fikrim yok ve hangi biçim dizesini kullanmalıyım?) veya kendi DateFormat ayrıştırıcımı yazmam gerekiyor. Yani, birisi kod örneği ile yardımcı olabilir eğer cidden takdir ediyorum.

DÜZENLEME: Tamam, tam kod için yanıtıma bakın. Ben çok uzak Android gelişme içine kazanılmış değil olarak

cevap

5

: Burada

bunun için kodları içeren bir StackOverflow yazıdır

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 
    } 
} 

sınıf daha sonra son derece basittir kullanarak, sadece yapın:

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

Bunu daha iyi kodlayabileceğimi + bunun .NET Ticks VS Java tıklamaları söz konusu olduğunda farklarla uğraşmak zorunda olduğumu farz ediyorum - ama şimdilik bu d O. Eğer birileri daha sonra daha iyi bir çözüme ya da daha fazla içgörüye sahipse, daha sonra ele alacağım - göndermekten çekinmeyin ve eğer cevabınız, eğer daha iyiyse, doğru olanı işaretleyeceğim.

DÜZENLEME: Bu question & answer'da açıkladığım gibi sunucuda ServiceStack.Text kitaplığına geçtim ve farklı ISO8601 biçimini döndürdüm. Bu format için biraz farklı ayrıştırma kullanıyorum (Jackson, milisaniye içeren ISO8601 ayrıştırmakta zorlanıyor). Ben post ediyorum diğer koduyla Elbette, - Daha iyi sürümü varsa bana bildirin (sadece daha çok yapılması gerektiğini nasıl felsefi söylemler başvurmadan yerine, bu yayını düzenlemek/kod gönderin):

@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

Kodunuzun iyi çalışması gerektiği anlaşılıyor ... yapacağım tek değişiklik "parse" yönteminizde bir RegEx yakalama grubu kullanıyor , string.indexOf/string.substring yerine. Bu sadece bir stil şey ... Ben her zaman string.indexOf/substring biraz kırılgan ve dizin/uzunluk ile ilgili çalışmak için zor bulundu. Sadece benim düşünceme göre. –

+0

@PhilipTenn Bana emin olacak sağlam bir Regex ve kod sağlamaya dikkat et? – kape123

3

Ben, bu yanlış olabilir, ama biçimi sundu:

"/Date(1277931782420)/" 

Unix çağ zamanı gibi görünüyor.

Bu durumda, SimpleDateFormat'u kullanmak istemezsiniz. Bunun yerine, bir Long oluşturup Date yapıcısına geçirmeyi deneyin; bu, saniyeler mi yoksa milisaniye tabanlı epoch değeri mi olduğunu hesaplar. Beklediğim sonra bu sert olduğunu kanıtladı https://stackoverflow.com/a/535017/463196

+0

Link için teşekkürler - Bu konu üzerinde çalışıyorum, fakat bazı beklenmedik sorunlar var (bkz. Düzenle) – kape123