Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将作为json字符串接收的.net DateTime解析为java';s日期对象_Android_.net_Json_Parsing_Datetime - Fatal编程技术网

Android 如何将作为json字符串接收的.net DateTime解析为java';s日期对象

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)\

我通过asmx Web服务接收.NET的
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)/”
没有时区UTC

  • “/日期(12345678989)/”
  • “/日期(-12345678989)/”
首先,您需要添加到您的项目中

1) 谷歌Gson库

2) JodaTime库 在JDK8之前使用

在JDK8或更高版本上,使用java.time

主类

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