Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 如何为JAXB(使用EclipseMoxy的json)设置浮点格式_Java_Json_Jaxb_Moxy - Fatal编程技术网

Java 如何为JAXB(使用EclipseMoxy的json)设置浮点格式

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 公共静态类

我有一个简单的pojo类:

@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()该类中的
方法。尝试直接将字段设置为type
FormattedDouble
导致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);
  }
}