2013-02-16 26 views
5

Tôi đang phân tích cú pháp JSON từ máy chủ trong ứng dụng Android của tôi bằng cách sử dụng thư viện JSON JSON. Tuy nhiên, phân tích yêu cầu thất bại bất cứ khi nào tôi nhận được DateTime vì nó ở định dạng này:Phân tích cú pháp ASP.NET MVC đã trả về ngày sử dụng thư viện JSON JSON trong Java

"/Date(1277931782420)/" 

tôi biết tôi nên làm điều gì đó như:

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

Nhưng tôi không có ý tưởng nếu tôi có thể sử dụng SimpleDateFormat ở tất cả (và tôi sẽ sử dụng chuỗi định dạng nào?) hoặc tôi cần phải viết trình phân tích cú pháp DateFormat của riêng mình. Vì vậy, tôi sẽ nghiêm túc đánh giá cao nếu ai đó có thể giúp với ví dụ mã.

EDIT: OK, xem câu trả lời của tôi để có mã hoàn chỉnh.

Trả lời

5

này được chứng minh là khó khăn hơn sau đó tôi mong đợi:

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ử dụng lớp là sau đó cực kỳ đơn giản, chỉ cần làm:

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

Tôi đoán rằng điều này có thể được mã hóa tốt hơn + rằng tôi sẽ cần phải đối phó với sự khác biệt khi nói đến .NET Ticks VS Java ticks - nhưng bây giờ điều này sẽ d o. Nếu ai đó có giải pháp tốt hơn hoặc thông tin chi tiết hơn về các vấn đề được đề cập, tôi sẽ xử lý sau - cảm thấy tự do để đăng và tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời đúng nếu nó tốt hơn.

EDIT: Như tôi đã giải thích trong số này question & answer Tôi đã chuyển sang thư viện ServiceStack.Text trên máy chủ và nó trả về định dạng ISO8601 khác nhau. Đối với định dạng đó, tôi đang sử dụng phân tích cú pháp hơi khác (vì Jackson gặp sự cố khi phân tích cú pháp ISO8601 có chứa mili giây). Tất nhiên, như với mã khác tôi đăng - hãy cho tôi biết nếu bạn có phiên bản tốt hơn (chỉ cần đăng mã/chỉnh sửa bài đăng này, thay vì sử dụng từ ngữ triết học về cách thực hiện):

@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

Có vẻ như mã của bạn sẽ hoạt động tốt ... thay đổi duy nhất tôi thực hiện là sử dụng nhóm chụp RegEx trong phương thức 'parse' của bạn , thay vì string.indexOf/string.substring. Đây chỉ là một điều phong cách ... Tôi đã luôn luôn tìm thấy string.indexOf/substring được hơi giòn và khó khăn để làm việc với liên quan đến chỉ số/chiều dài. Chỉ là ý kiến ​​khiêm nhường của tôi. –

+0

@PhilipTenn Chăm sóc để cung cấp cho tôi một mã Regex & mã mạnh mẽ sẽ hoạt động chắc chắn? – kape123

3

Tôi có thể sai về vấn đề này, như tôi đã không nhận rất xa vào phát triển Android, nhưng định dạng mà bạn trình bày:

"/Date(1277931782420)/" 

Xuất hiện được Unix thời gian kỷ nguyên.

Nếu đúng như vậy, bạn sẽ không muốn/cần sử dụng SimpleDateFormat. Thay vào đó, hãy thử tạo một Long từ nó và chuyển đến hàm tạo Date, tính xem đó là giá trị thời gian trên giây hay mili giây.

Đây là một bài StackOverflow cung cấp mã để làm như vậy: https://stackoverflow.com/a/535017/463196

+0

Cảm ơn bạn đã liên kết - Tôi đang nghiên cứu vấn đề này, nhưng có một số vấn đề không mong muốn (xem chỉnh sửa) – kape123

Các vấn đề liên quan