Android 如何将作为json字符串接收的.net DateTime解析为java';s日期对象
我通过asmx Web服务接收.NET的Android 如何将作为json字符串接收的.net DateTime解析为java';s日期对象,android,.net,json,parsing,datetime,Android,.net,Json,Parsing,Datetime,我通过asmx Web服务接收.NET的DateTime对象作为json字符串,并试图在gson库的帮助下解析它。但似乎不支持解析.net风格的DateTime。 如何使用Gson轻松地将其解析为java的Date对象而不费吹灰之力 我收到的字符串如下所示: "DateOfBirth":"\/Date(736032869080)\/" 另外,我不想在服务器端进行任何修改,以将DateTime作为一个长值来接收如下: String json = "\"\\/Date(736032869080)\
DateTime
对象作为json字符串,并试图在gson库的帮助下解析它。但似乎不支持解析.net风格的DateTime。
如何使用Gson轻松地将其解析为java的Date
对象而不费吹灰之力
我收到的字符串如下所示:
"DateOfBirth":"\/Date(736032869080)\/"
另外,我不想在服务器端进行任何修改,以将DateTime作为一个长值来接收如下:
String json = "\"\\/Date(736032869080)\\/\"";
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new NetDateTimeAdapter()).create();
System.out.println("Date=" + gson.fromJson(json, Date.class));
class NetDateTimeAdapter extends TypeAdapter<Date> {
@Override
public Date read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
Date result = null;
String str = reader.nextString();
str = str.replaceAll("[^0-9]", "");
if (!TextUtils.isEmpty(str)) {
try {
result = new Date(Long.parseLong(str));
} catch (NumberFormatException e) {
}
}
return result;
}
@Override
public void write(JsonWriter writer, Date value) throws IOException {
// Nah..
}
}
String json=“\”\\\/Date(736032869080)\\/\”;
Gson Gson=new GsonBuilder().registerTypeAdapter(Date.class,new NetDateTimeAdapter()).create();
System.out.println(“Date=“+gson.fromJson(json,Date.class));
类NetDateTimeAdapter扩展了TypeAdapter{
@凌驾
公共日期读取(JsonReader)引发IOException{
if(reader.peek()==JsonToken.NULL){
reader.nextNull();
返回null;
}
日期结果=空;
String str=reader.nextString();
str=str.replaceAll(“[^0-9]”,“”);
如果(!TextUtils.isEmpty(str)){
试一试{
结果=新日期(Long.parseLong(str));
}捕获(数字格式){
}
}
返回结果;
}
@凌驾
public void write(JsonWriter writer,日期值)引发IOException{
//不。。
}
}
或者改为使用并遵循“处理WCF Microsoft JSON日期”一章。我已经实现了一个GsonHelper,它可以帮助反序列化和序列化。NET
DateTime
使用GSON从JSON格式化。用法:
// How to get DataClass object from JSON string
Gson gson = new GsonHelper().getGson();
DataClass DATA = gson.fromJson(YOUR_JSON, DataClass.class);
// How to get JSON string from your JSON data
Gson gson = new GsonHelper().getGson();
String JSON = gson.toJson(DATA);
这是助手类:
public class GsonHelper
{
public Gson getGson()
{
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Date.class, new DotNetDateDeserializer());
builder.registerTypeAdapter(Date.class, new DotNetDateSerializer());
return builder.create();
}
public class DotNetDateDeserializer implements JsonDeserializer<Date>
{
@Override
public Date deserialize(JsonElement json, Type typfOfT, JsonDeserializationContext context)
{
try
{
String dateStr = json.getAsString();
if (dateStr != null) dateStr = dateStr.replace("/Date(", "");
if (dateStr != null) dateStr = dateStr.replace("+0000)/", "");
if (dateStr != null) dateStr = dateStr.replace(")/", "");
long time = Long.parseLong(dateStr);
return new Date(time);
}
catch (Exception ex)
{
ex.printStackTrace();
return null;
}
}
}
public class DotNetDateSerializer implements JsonSerializer<Date>
{
@Override
public JsonElement serialize(Date date, Type typfOfT, JsonSerializationContext context)
{
if (date == null)
return null;
String dateStr = "/Date(" + date.getTime() + ")/";
return new JsonPrimitive(dateStr);
}
}
公共类GsonHelper
{
公共Gson getGson()
{
GsonBuilder=新的GsonBuilder();
registerTypeAdapter(Date.class,新的DotNetDateDeserializer());
registerTypeAdapter(Date.class,新的DotNetDateSerializer());
返回builder.create();
}
公共类DotNetDateDeserializer实现JsonDeserializer
{
@凌驾
公共日期反序列化(JsonElement json,类型typfOfT,JsonDeserializationContext)
{
尝试
{
字符串dateStr=json.getAsString();
如果(dateStr!=null)dateStr=dateStr.replace(“/Date(“,”);
如果(dateStr!=null)dateStr=dateStr.replace(“+0000)/”,“”);
如果(dateStr!=null)dateStr=dateStr.replace(“)/”,“);
long time=long.parseLong(dateStr);
返回新的日期(时间);
}
捕获(例外情况除外)
{
例如printStackTrace();
返回null;
}
}
}
公共类DotNetDateSerializer实现JsonSerializer
{
@凌驾
公共JsonElement序列化(日期,类型typfOfT,JsonSerializationContext)
{
如果(日期==null)
返回null;
字符串dateStr=“/Date(“+Date.getTime()+”/”;
返回新的JsonPrimitive(dateStr);
}
}
注意:适用于两种格式:
/Date(1362853251000)/
和/Date(1362853251000+0000)/
。助手必须根据时间定义调整为其他格式。不知道……我已经尝试了上述所有格式。但对我来说不起作用。最后,我提出了这个解决方案:)
当您从json获取字符串时,对象字符串将类似于:“/Date(1373543393598+0200)/”。但如果您在从服务器提交的结果字符串上看到:{“respDateTime”:“/Date(1373267484478+0200)/”}
要手动将.NET JSON日期转换为JodaTime DateTime对象(本机Java类型类似),还可以使用正则表达式:
public static DateTime parseDotNetTime(String json) {
DateTime result = null;
if (json != null) {
Pattern datePatt = Pattern.compile("^/Date\\((\\d+)([+-]\\d+)?\\)/$");
Matcher m = datePatt.matcher(json);
if (m.matches()) {
Long l = Long.parseLong(m.group(1));
result = new DateTime(l);
// Time zone is not needed to calculate date
} else {
throw new IllegalArgumentException("Wrong date format");
}
}
return result;
}
我已经实现了这个,可以与.NET WCF DateTime Json格式进行互操作。 时区
- “/日期(12345678989+0000)/”
- “/日期(12345678989-0000)/”
- “/日期(-12345678989+0000)/”
- “/日期(-12345678989-0000)/”
- “/日期(12345678989)/”
- “/日期(-12345678989)/”
package tests;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.joda.time.DateTime;
/**
*
* @author Joma Espinoza Bone.
*/
public class JsonSerializerDeserializer {
private static Gson handler = null;
public static void initialize(Boolean useDotNetFormat) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(DateTime.class, new DateTimeSerializer(useDotNetFormat));
builder.registerTypeAdapter(DateTime.class, new DateTimeDeserializer(useDotNetFormat));
handler = builder.create();
}
private JsonSerializerDeserializer() {
}
public static <T> String serialize(T instance, Boolean useDotNetFormat) {
initialize(useDotNetFormat);
if (useDotNetFormat) {
return (handler.toJson(instance, instance.getClass())).replace("/", "\\/");
} else {
return handler.toJson(instance, instance.getClass());
}
}
public static <T> T deserialize(String json, Class<T> resultType) {
initialize(json.contains("\\/Date("));
return handler.fromJson(json, resultType);
}
}
package tests;
/**
* Created by Joma on 17/06/2015.
*/
public class Strings
{
public static Boolean isNullOrEmpty(String value)
{
if (value != null)
{
return value.length() == 0;
}
else
{
return true;
}
}
public static Boolean isNullOrWhiteSpace(String value)
{
if (value == null)
{
return true;
}
if (value.trim().length() == 0)
{
return true;
}
else
{
return false;
}
}
public static String format(String format, Object... params)
{
for(int i = 0; i< params.length; i++)
{
format = format.replaceAll(String.format("\\{%s\\}", i), params[i].toString());
}
return format;
}
}
还有我的主考班
package tests;
import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
/**
*
* @author Joma Espinoza Bone.
*/
public class Tests {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
DateTime dateTime = new DateTime();//new DateTime(1467880743533L, DateTimeZone.forOffsetHours(-5));
System.out.println(dateTime.toString(ISODateTimeFormat.dateTime()));
String json = JsonSerializerDeserializer.serialize(dateTime, Boolean.TRUE);
System.out.println(json);
dateTime = JsonSerializerDeserializer.deserialize(json, DateTime.class);
System.out.println(dateTime.toString(ISODateTimeFormat.dateTime()));
MyClass obj = new MyClass();
DateTime datetime = new DateTime(new Date(115, 5, 18, 18, 5, 14));//new Date(Calendar.getInstance().getTimeInMillis());
obj.setDateTime(datetime);
obj.setNames("Joma");
String jsonDotNet = JsonSerializerDeserializer.serialize(obj, true);
String jsonJava = JsonSerializerDeserializer.serialize(obj, Boolean.FALSE);
System.out.println("Json DotNet: " + jsonDotNet);
System.out.println("Json Java: " + jsonJava);
System.out.println("Deserialized DotNet: " + JsonSerializerDeserializer.deserialize(jsonDotNet, MyClass.class).toString());
System.out.println("Deserialized Java: " + JsonSerializerDeserializer.deserialize(jsonJava, MyClass.class).toString());
//18/06/2015 21:35:45 Generated from DotNet Date with TimeZone.
String json1 = "{\"DateTime\":\"\\/Date(1434681345267-0500)\\/\",\"Names\":\"Joma\"}";
//18/06/2015 21:35:45 Generated from JsonSerializerDeserializer.serialize(Object instance, Boolean ToDotNetFormat) DotNetFormat without TimeZone.
String json2 = "{\"DateTime\":\"\\/Date(1434663345267)\\/\",\"Names\":\"Joma\"}";
// Java DateTime with TimeZone.
String json3 = "{\"DateTime\":\"2016-07-07T16:40:27.720-05:00\",\"Names\":\"Joma\"}";
//Java DateTime without TimeZone - UTC
String json4 = "{\"DateTime\":\"2016-07-07T16:40:27.720Z\",\"Names\":\"Joma\"}";
System.out.println("Deserialized 1: " + JsonSerializerDeserializer.deserialize(json1, MyClass.class));
System.out.println("Deserialized 2: " + JsonSerializerDeserializer.deserialize(json2, MyClass.class));
System.out.println("Deserialized 3: " + JsonSerializerDeserializer.deserialize(json3, MyClass.class));
System.out.println("Deserialized 4: " + JsonSerializerDeserializer.deserialize(json4, MyClass.class));
}
}
我的Util/Helper类
package tests;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.joda.time.DateTime;
/**
*
* @author Joma Espinoza Bone.
*/
public class JsonSerializerDeserializer {
private static Gson handler = null;
public static void initialize(Boolean useDotNetFormat) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(DateTime.class, new DateTimeSerializer(useDotNetFormat));
builder.registerTypeAdapter(DateTime.class, new DateTimeDeserializer(useDotNetFormat));
handler = builder.create();
}
private JsonSerializerDeserializer() {
}
public static <T> String serialize(T instance, Boolean useDotNetFormat) {
initialize(useDotNetFormat);
if (useDotNetFormat) {
return (handler.toJson(instance, instance.getClass())).replace("/", "\\/");
} else {
return handler.toJson(instance, instance.getClass());
}
}
public static <T> T deserialize(String json, Class<T> resultType) {
initialize(json.contains("\\/Date("));
return handler.fromJson(json, resultType);
}
}
package tests;
/**
* Created by Joma on 17/06/2015.
*/
public class Strings
{
public static Boolean isNullOrEmpty(String value)
{
if (value != null)
{
return value.length() == 0;
}
else
{
return true;
}
}
public static Boolean isNullOrWhiteSpace(String value)
{
if (value == null)
{
return true;
}
if (value.trim().length() == 0)
{
return true;
}
else
{
return false;
}
}
public static String format(String format, Object... params)
{
for(int i = 0; i< params.length; i++)
{
format = format.replaceAll(String.format("\\{%s\\}", i), params[i].toString());
}
return format;
}
}
包测试;
/**
*由Joma于2015年6月17日创建。
*/
公共类字符串
{
公共静态布尔值isNullOrEmpty(字符串值)
{
if(值!=null)
{
返回值。length()==0;
}
其他的
{
返回true;
}
}
公共静态布尔值isNullOrWhiteSpace(字符串值)
{
如果(值==null)
{
返回true;
}
如果(value.trim().length()==0)
{
返回true;
}
其他的
{
返回false;
}
}
公共静态字符串格式(字符串格式、对象…参数)
{
对于(int i=0;i
注意:
*
序列化/反序列化时的所有日期时间值都转换为UTC
*
String date=“\/date(736032869080)\/”date parsed=new date(Long.parseLong(date.substring(6,date.length()-2));
FYI——我有时会收到类似于“\/date(1327875714113-0800)\/”
的消息,所以你可能想把它考虑进去“今天我要去创建一个不合适的、毫无意义的、可读性差的标准”,就像他们从来没有听说过ISO8601.Link一样
package tests;
import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
/**
*
* @author Joma Espinoza Bone.
*/
public class Tests {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
DateTime dateTime = new DateTime();//new DateTime(1467880743533L, DateTimeZone.forOffsetHours(-5));
System.out.println(dateTime.toString(ISODateTimeFormat.dateTime()));
String json = JsonSerializerDeserializer.serialize(dateTime, Boolean.TRUE);
System.out.println(json);
dateTime = JsonSerializerDeserializer.deserialize(json, DateTime.class);
System.out.println(dateTime.toString(ISODateTimeFormat.dateTime()));
MyClass obj = new MyClass();
DateTime datetime = new DateTime(new Date(115, 5, 18, 18, 5, 14));//new Date(Calendar.getInstance().getTimeInMillis());
obj.setDateTime(datetime);
obj.setNames("Joma");
String jsonDotNet = JsonSerializerDeserializer.serialize(obj, true);
String jsonJava = JsonSerializerDeserializer.serialize(obj, Boolean.FALSE);
System.out.println("Json DotNet: " + jsonDotNet);
System.out.println("Json Java: " + jsonJava);
System.out.println("Deserialized DotNet: " + JsonSerializerDeserializer.deserialize(jsonDotNet, MyClass.class).toString());
System.out.println("Deserialized Java: " + JsonSerializerDeserializer.deserialize(jsonJava, MyClass.class).toString());
//18/06/2015 21:35:45 Generated from DotNet Date with TimeZone.
String json1 = "{\"DateTime\":\"\\/Date(1434681345267-0500)\\/\",\"Names\":\"Joma\"}";
//18/06/2015 21:35:45 Generated from JsonSerializerDeserializer.serialize(Object instance, Boolean ToDotNetFormat) DotNetFormat without TimeZone.
String json2 = "{\"DateTime\":\"\\/Date(1434663345267)\\/\",\"Names\":\"Joma\"}";
// Java DateTime with TimeZone.
String json3 = "{\"DateTime\":\"2016-07-07T16:40:27.720-05:00\",\"Names\":\"Joma\"}";
//Java DateTime without TimeZone - UTC
String json4 = "{\"DateTime\":\"2016-07-07T16:40:27.720Z\",\"Names\":\"Joma\"}";
System.out.println("Deserialized 1: " + JsonSerializerDeserializer.deserialize(json1, MyClass.class));
System.out.println("Deserialized 2: " + JsonSerializerDeserializer.deserialize(json2, MyClass.class));
System.out.println("Deserialized 3: " + JsonSerializerDeserializer.deserialize(json3, MyClass.class));
System.out.println("Deserialized 4: " + JsonSerializerDeserializer.deserialize(json4, MyClass.class));
}
}
package tests;
/**
* Created by Joma on 17/06/2015.
*/
public class Strings
{
public static Boolean isNullOrEmpty(String value)
{
if (value != null)
{
return value.length() == 0;
}
else
{
return true;
}
}
public static Boolean isNullOrWhiteSpace(String value)
{
if (value == null)
{
return true;
}
if (value.trim().length() == 0)
{
return true;
}
else
{
return false;
}
}
public static String format(String format, Object... params)
{
for(int i = 0; i< params.length; i++)
{
format = format.replaceAll(String.format("\\{%s\\}", i), params[i].toString());
}
return format;
}
}