Java 如何为JAXB(使用EclipseMoxy的json)设置浮点格式
我有一个简单的pojo类:Java 如何为JAXB(使用EclipseMoxy的json)设置浮点格式,java,json,jaxb,moxy,Java,Json,Jaxb,Moxy,我有一个简单的pojo类: @XmlRootElement public static class MyClass { private double f; //[0-1] @XmlAttribute //@XmlJavaTypeAdapter(FixedFloatingPointXmlAdapter.class) <-- has issues public double getF() { return f; } } @XmlRootElement 公共静态类
@XmlRootElement
public static class MyClass {
private double f; //[0-1]
@XmlAttribute
//@XmlJavaTypeAdapter(FixedFloatingPointXmlAdapter.class) <-- has issues
public double getF() {
return f;
}
}
@XmlRootElement
公共静态类MyClass{
私人双f;//[0-1]
@XmlAttribute
//@XmlJavaTypeAdapter(FixedFloatingPointXmlAdapter.class)此解决方案使用的是EclipseLink MOXy
import org.eclipse.persistence.oxm.annotations.XmlTransformation;
import org.eclipse.persistence.oxm.annotations.XmlWriteTransformer;
@XmlRootElement
public static class MyClass {
@XmlAttribute
@XmlReadTransformer(transformerClass=FixedFloatingTransformer.class)
@XmlWriteTransformer(xmlPath="@f", transformerClass=FixedFloatingTransformer.class)
private double f; //[0-1]
public double getF() {
return f;
}
}
下面是transformerClass
的实现
import java.text.DecimalFormat;
import org.eclipse.persistence.mappings.foundation.AbstractTransformationMapping;
import org.eclipse.persistence.mappings.transformers.AttributeTransformer;
import org.eclipse.persistence.mappings.transformers.FieldTransformer;
import org.eclipse.persistence.sessions.Record;
import org.eclipse.persistence.sessions.Session;
public class FixedFloatingTransformer implements FieldTransformer, AttributeTransformer {
private AbstractTransformationMapping mapping;
private static DecimalFormat FORMAT = new DecimalFormat("0.00000000");
public Object buildAttributeValue(Record r, Object obj, Session arg2) {
return r.get(mapping.getFields().get(0));
}
public Object buildFieldValue(Object instance, String xpath, Session session) {
Object o2 = mapping.getAttributeValueFromObject(instance);
if (o2 instanceof Number) {
return ((DecimalFormat)FORMAT.clone()).format((Number)o2);
}
return null;
}
public void initialize(AbstractTransformationMapping mapping) {
this.mapping = mapping;
}
}
2016/12/13更新
当moxy
将对象解组为JSON字符串时,将引用@XmlSchemaType
。
如果name
是boolean
或number type
,moxy
将输出不带引号的值字符串
示例1:必须将格式化值设置为f
示例2:添加额外的getter以返回格式化的值
我不确定我是否正确理解了您的问题,但是您是否尝试过修剪结果字符串FORMAT.FORMAT(v),以便不返回字符串中的引号?是什么给出了FORMAT.FORMAT(v)作为结果字符串?我不确定这是否是JAXB问题。如果您有complexType,那么使用XmlAdapter是正确的。对于simpleType,请与parseMethod/printMethod一起使用。有关示例,请参阅JAXB 2.2规范第7.8.2章。由于xml适配器是双-->字符串,因此它会将结果打印为字符串。其nor按格式引用,它被一般机制引用(因为适配器后面是字符串,而不是数字)您是否尝试过另一种方法,使用parseMethod/printMethod?请参见此处和示例:我的项目中没有任何xml描述符文件,如果可能的话,我希望将其保留为基于注释的。我最终使用了此答案的一个变体。原样答案返回buildFieldValue()中的字符串
,这将导致编组代码引用字符串。但是,我最终返回了类FormattedDouble extends Number
,并放置了一个toString()该类中的
方法。尝试直接将字段设置为typeFormattedDouble
导致moxy出现异常,我认为这是一个错误。您所说的是正确的。我在测试您的实现时得到了另一个解决方案。请参考更新的答案。
import java.text.DecimalFormat;
import org.eclipse.persistence.mappings.foundation.AbstractTransformationMapping;
import org.eclipse.persistence.mappings.transformers.AttributeTransformer;
import org.eclipse.persistence.mappings.transformers.FieldTransformer;
import org.eclipse.persistence.sessions.Record;
import org.eclipse.persistence.sessions.Session;
public class FixedFloatingTransformer implements FieldTransformer, AttributeTransformer {
private AbstractTransformationMapping mapping;
private static DecimalFormat FORMAT = new DecimalFormat("0.00000000");
public Object buildAttributeValue(Record r, Object obj, Session arg2) {
return r.get(mapping.getFields().get(0));
}
public Object buildFieldValue(Object instance, String xpath, Session session) {
Object o2 = mapping.getAttributeValueFromObject(instance);
if (o2 instanceof Number) {
return ((DecimalFormat)FORMAT.clone()).format((Number)o2);
}
return null;
}
public void initialize(AbstractTransformationMapping mapping) {
this.mapping = mapping;
}
}
public static class MyClass {
private String f;
@XmlAttribute
@XmlSchemaType(name="double")
public String getF() {
return f;
}
}
public static class MyClass {
private double f;
@XmlTransient //preventing the mapping
public double getF() {
return f;
}
@XmlAttribute(name="f")
@XmlSchemaType(name="double")
public String getFAsString() {
return new DecimalFormat("0.00000000").format(f);
}
}