Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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 GSON序列化未返回正确的json字符串_Java_Json_Gson - Fatal编程技术网

Java GSON序列化未返回正确的json字符串

Java GSON序列化未返回正确的json字符串,java,json,gson,Java,Json,Gson,我正在尝试用GSON序列化这种格式的对象 这是我的密码: public String encode(Object object){ return this.gson.toJson(object); } 问题是我得到的结果是: "m_Volume": 57056040 与我的预期相反: "m_Volume": { "m_Exponent": 0, "m_Mantissa": [4, 3, 102, -101, 40] } 任何帮助/建议都会很好。谢谢 我看到您有一个名为Xe

我正在尝试用GSON序列化这种格式的对象

这是我的密码:

public String encode(Object object){
    return this.gson.toJson(object);
}
问题是我得到的结果是:

"m_Volume": 57056040
与我的预期相反:

"m_Volume": {
  "m_Exponent": 0,
  "m_Mantissa": [4, 3, 102, -101, 40]
}

任何帮助/建议都会很好。谢谢

我看到您有一个名为
XempBigDecimal

也许可以代替:

public String encode(Object object){
    return this.gson.toJson(object);
}
尝试传递混凝土类型:

public String encode(XempBigDecimal object){
    return this.gson.toJson(object);
}
编辑

我试图通过单元测试重现您的案例,如下所示:

public class GsonTest {

  private Gson gson;

  @Before
  public void setUp() {
    gson = new Gson();
  }

  @Test
  public void shouldCreateJson() {
    XempBigDecimal object = new XempBigDecimal(new m_Volume(0, new byte[] {4, 3, 102, -101, 40}));

    String json = encode(object);

    assertThat(json).isEqualTo("{\"m_Volume\":{\"m_Exponent\":0,\"m_Mantissa\":[4,3,102,-101,40]}}");
  }

  public String encode(Object object) {
    return gson.toJson(object);
  }

  public String encodeType(XempBigDecimal object) {
    return gson.toJson(object);
  }

  private class XempBigDecimal {
    public XempBigDecimal(GsonTest.m_Volume m_Volume) {
      this.m_Volume = m_Volume;
    }

    private m_Volume m_Volume;
  }

  private class m_Volume {
    public m_Volume(int m_Exponent, byte[] m_Mantissa) {
      this.m_Exponent = m_Exponent;
      this.m_Mantissa = m_Mantissa;
    }

    private int m_Exponent;
    private byte[] m_Mantissa;
  }
}

而且这个测试通过了,所以将参数定义为
对象
类型可能不是问题。也许您的对象或类定义有问题?也许Gson忽略了
m_指数
m_尾数
?当它们后跟
transient
关键字时,可能会发生这种情况。

@YogenRai该函数被多次调用,因此我无法传入特定的对象类型,因此通用对象类。您能告诉我您为什么期望所期望的吗?在这种情况下,传递给
encode(…)
的对象是什么?你能分享这个类的代码吗?我不能这样做,在这种情况下,encode方法被不同的对象使用。如果你认为这能解决问题,我将尝试用你的解决方案进一步调查。你能为不同类型创建单独的方法吗?@piotr.witchen这不是有效的,但你认为这是问题的原因吗?@WaleA。我已经更新了我的答案。传递
对象
类型可能不是问题的根源。我还提供了其他建议。我在任何属性上都没有transient关键字。但是感谢您编写了一个测试用例。我会继续挖