Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ private void initJSONConfiguration() {
}
marshallers.add(new org.grails.web.converters.marshaller.json.DateMarshaller());
}
marshallers.add(new org.grails.web.converters.marshaller.json.CalendarMarshaller());
marshallers.add(new org.grails.web.converters.marshaller.json.InstantMarshaller());
marshallers.add(new org.grails.web.converters.marshaller.json.LocalDateMarshaller());
marshallers.add(new org.grails.web.converters.marshaller.json.LocalDateTimeMarshaller());
marshallers.add(new org.grails.web.converters.marshaller.json.OffsetDateTimeMarshaller());
marshallers.add(new org.grails.web.converters.marshaller.json.ZonedDateTimeMarshaller());
marshallers.add(new org.grails.web.converters.marshaller.json.ToStringBeanMarshaller());

boolean includeDomainVersion = includeDomainVersionProperty(grailsConfig, "json");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.grails.web.converters.marshaller.json;

import java.text.Format;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

import org.apache.commons.lang3.time.FastDateFormat;

import grails.converters.JSON;
import org.grails.web.converters.exceptions.ConverterException;
import org.grails.web.converters.marshaller.ObjectMarshaller;
import org.grails.web.json.JSONException;

/**
* JSON ObjectMarshaller which converts a Calendar Object to ISO-8601 format with Z suffix.
*
* @since 7.0
*/
public class CalendarMarshaller implements ObjectMarshaller<JSON> {

private final Format formatter;

/**
* Constructor with a custom formatter.
* @param formatter the formatter
*/
public CalendarMarshaller(Format formatter) {
this.formatter = formatter;
}

/**
* Default constructor.
*/
public CalendarMarshaller() {
this(FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", TimeZone.getTimeZone("GMT"), Locale.US));
}

public boolean supports(Object object) {
return object instanceof Calendar;
}

public void marshalObject(Object object, JSON converter) throws ConverterException {
try {
Calendar calendar = (Calendar) object;
converter.getWriter().value(formatter.format(calendar.getTime()));
}
catch (JSONException e) {
throw new ConverterException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public DateMarshaller(Format formatter) {
* Default constructor.
*/
public DateMarshaller() {
this(FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("GMT"), Locale.US));
this(FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", TimeZone.getTimeZone("GMT"), Locale.US));
}

public boolean supports(Object object) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.grails.web.converters.marshaller.json;

import java.time.Instant;
import java.time.format.DateTimeFormatter;

import grails.converters.JSON;
import org.grails.web.converters.exceptions.ConverterException;
import org.grails.web.converters.marshaller.ObjectMarshaller;
import org.grails.web.json.JSONException;

/**
* JSON ObjectMarshaller which converts an Instant to ISO-8601 format with Z suffix.
*
* @since 7.0
*/
public class InstantMarshaller implements ObjectMarshaller<JSON> {

public boolean supports(Object object) {
return object instanceof Instant;
}

public void marshalObject(Object object, JSON converter) throws ConverterException {
try {
Instant instant = (Instant) object;
converter.getWriter().value(DateTimeFormatter.ISO_INSTANT.format(instant));
}
catch (JSONException e) {
throw new ConverterException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.grails.web.converters.marshaller.json;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import grails.converters.JSON;
import org.grails.web.converters.exceptions.ConverterException;
import org.grails.web.converters.marshaller.ObjectMarshaller;
import org.grails.web.json.JSONException;

/**
* JSON ObjectMarshaller which converts a LocalDate to ISO-8601 date format (YYYY-MM-DD).
*
* @since 7.0
*/
public class LocalDateMarshaller implements ObjectMarshaller<JSON> {

public boolean supports(Object object) {
return object instanceof LocalDate;
}

public void marshalObject(Object object, JSON converter) throws ConverterException {
try {
LocalDate localDate = (LocalDate) object;
converter.getWriter().value(DateTimeFormatter.ISO_LOCAL_DATE.format(localDate));
}
catch (JSONException e) {
throw new ConverterException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.grails.web.converters.marshaller.json;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import grails.converters.JSON;
import org.grails.web.converters.exceptions.ConverterException;
import org.grails.web.converters.marshaller.ObjectMarshaller;
import org.grails.web.json.JSONException;

/**
* JSON ObjectMarshaller which converts a LocalDateTime to ISO-8601 format (without timezone).
*
* @since 7.0
*/
public class LocalDateTimeMarshaller implements ObjectMarshaller<JSON> {

public boolean supports(Object object) {
return object instanceof LocalDateTime;
}

public void marshalObject(Object object, JSON converter) throws ConverterException {
try {
LocalDateTime localDateTime = (LocalDateTime) object;
converter.getWriter().value(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));
}
catch (JSONException e) {
throw new ConverterException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.grails.web.converters.marshaller.json;

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

import grails.converters.JSON;
import org.grails.web.converters.exceptions.ConverterException;
import org.grails.web.converters.marshaller.ObjectMarshaller;
import org.grails.web.json.JSONException;

/**
* JSON ObjectMarshaller which converts an OffsetDateTime to ISO-8601 format with timezone offset.
*
* @since 7.0
*/
public class OffsetDateTimeMarshaller implements ObjectMarshaller<JSON> {

public boolean supports(Object object) {
return object instanceof OffsetDateTime;
}

public void marshalObject(Object object, JSON converter) throws ConverterException {
try {
OffsetDateTime offsetDateTime = (OffsetDateTime) object;
converter.getWriter().value(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(offsetDateTime));
}
catch (JSONException e) {
throw new ConverterException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.grails.web.converters.marshaller.json;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

import grails.converters.JSON;
import org.grails.web.converters.exceptions.ConverterException;
import org.grails.web.converters.marshaller.ObjectMarshaller;
import org.grails.web.json.JSONException;

/**
* JSON ObjectMarshaller which converts a ZonedDateTime to ISO-8601 format with timezone offset.
*
* @since 7.0
*/
public class ZonedDateTimeMarshaller implements ObjectMarshaller<JSON> {

public boolean supports(Object object) {
return object instanceof ZonedDateTime;
}

public void marshalObject(Object object, JSON converter) throws ConverterException {
try {
ZonedDateTime zonedDateTime = (ZonedDateTime) object;
converter.getWriter().value(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(zonedDateTime));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add comment why we are using ISO_OFFSET_DATE_TIME instead of ISO_ZONED_DATE_TIME formatter?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@matrei see comment above

}
catch (JSONException e) {
throw new ConverterException(e);
}
}
}
Loading
Loading