Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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
Java 自定义JodaTime序列化类返回大型对象_Java_Serialization_Jodatime - Fatal编程技术网

Java 自定义JodaTime序列化类返回大型对象

Java 自定义JodaTime序列化类返回大型对象,java,serialization,jodatime,Java,Serialization,Jodatime,我需要将Joda DateTime序列化为单个字符串的JSON。我使用JsonSerializer的实现,它假设生成字符串,但我得到的对象具有很多属性: "metrics":{"startTimestamp":{"year":2014,"dayOfMonth":11,"dayOfWeek":2,"era":1,"dayOfYear":315,"centuryOfEra":20,"yearOfCentury":14,"monthOfYear":11,"weekOfWeekyear":46,"mil

我需要将Joda DateTime序列化为单个字符串的JSON。我使用JsonSerializer的实现,它假设生成字符串,但我得到的对象具有很多属性:

"metrics":{"startTimestamp":{"year":2014,"dayOfMonth":11,"dayOfWeek":2,"era":1,"dayOfYear":315,"centuryOfEra":20,"yearOfCentury":14,"monthOfYear":11,"weekOfWeekyear":46,"millisOfSecond":505,"millisOfDay":36348505,"secondOfMinute":48,"secondOfDay":36348,"minuteOfHour":5,.......... etc
但是我需要像
dd.mm.yyyy HH:mm:ss.SSS
这样的字符串。怎么做

CustomDateSerializer

public class CustomDateSerializer extends JsonSerializer<DateTime> {
    private static DateTimeFormatter formatter = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm:ss.SSS");

    @Override
    public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) throws IOException, JsonProcessingException {
        gen.writeString(formatter.print(value));
//        System.out.println(formatter.print(value));
    }
    @Override
    public Class<DateTime> handledType() {
        return DateTime.class;
    }
}
更新:

System.out.println(formatter.print(value))
in
CustomDateSerializer
实际上打印了正确的字符串,但由于某种原因,它未能将其传递给序列化程序,我假定

更新2

控制器

public @ResponseBody XmlResponse getGUID( @RequestParam(/*...*/) String environmentParam) {
//.... XmlResponse xmlResponse = ..........
return xmlResponse;
}
XmlResponse类

    import app.service.CustomDateSerializer;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

public class Metrics {
//    @JsonSerialize(using = CustomDateSerializer.class)
    DateTime startTimestamp;
//    @JsonSerialize(using = CustomDateSerializer.class)
    DateTime endTimestamp;
    Period period;
    @JsonIgnore
    PeriodFormatter periodFormatter;

    public Metrics() {

    }
    public DateTime getStartTimestamp() {
        return startTimestamp;
    }

    public void setStartTimestamp(DateTime startTimestamp) {
        this.startTimestamp = startTimestamp;
    }

    public DateTime getEndTimestamp() {
        return endTimestamp;
    }

    public void setEndTimestamp(DateTime endTimestamp) {
        this.endTimestamp = endTimestamp;
    }

    public Period getPeriod() {
        return period;
    }
    public void setPeriod() {
        this.period = new Period(this.startTimestamp, this.endTimestamp);
    }
    public void setPeriod(Period period) {
        this.period = period;
    }

    public PeriodFormatter getPeriodFormatter() {
        return periodFormatter;
    }

    public void setPeriodFormatter(PeriodFormatter periodFormatter) {
        this.periodFormatter = periodFormatter;
    }
   @Override
   public String toString(){
       this.periodFormatter = new PeriodFormatterBuilder()
                .printZeroAlways()
                .minimumPrintedDigits(2)
                .appendHours().appendSeparator(":")
                .appendMinutes().appendSeparator(":")
                .appendSeconds().appendSeparator(".")
                .appendMillis3Digit()
                .toFormatter();
       return "Started: " + this.startTimestamp.toString() + "\\n" + "Ended:   " + this.endTimestamp.toString() + "\\n" + "Response took: " + periodFormatter.print(period)+ "";
   }
}
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;

public class XmlResponse {
    String xmlResponseBody;
    @JsonIgnore
    Metrics metrics;
    Boolean error;

    public XmlResponse() {
    }

    public XmlResponse(String xmlResponseBody, Metrics metrics, Boolean error) {
        this.xmlResponseBody = xmlResponseBody;
        this.metrics = metrics;
        this.error = error;
    }

    public String getXmlResponseBody() {
        return xmlResponseBody;
    }

    public void setXmlResponseBody(String xmlResponseBody) {
        this.xmlResponseBody = xmlResponseBody;
    }
    @JsonProperty("metrics")
    public Metrics getMetrics() {
        return metrics;
    }

    public void setMetrics(Metrics metrics) {
        this.metrics = metrics;
    }

    public Boolean getError() {
        return error;
    }

    public void setError(Boolean error) {
        this.error = error;
    }

    @Override
    public String toString(){
        String out = "";
        ObjectMapper mapper = new ObjectMapper();
        try {
//            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//            mapper.registerModule(new JodaModule());
             out = mapper.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return "{}";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out;
    }
}
更新3


取消注释
@JsonSerialize(使用=CustomDateSerializer.class)
不会更改结果

您的代码是Jackson 1.x(
org.codehaus.Jackson
)和Jackson 2.x(
com.fasterxml.Jackson
)的混合体。虽然它们的API非常相似,但Jackson 1.x的注释对Jackson 2.x没有影响,反之亦然(除非您使用)

确保您在任何地方使用相同的Jackson版本都会有助于解决您的问题。

您可以在那里获得更多信息:。

您的代码似乎为我提供了使用
ObjectMapper#writeValue
的预期输出。具体如何执行序列化?