我必须用Java编写代理客户端才能连接到JSON WebService。我只有WebService方法和类型的文字描述。例如,一种方法的结果是

参数{
byte []挑战;
字节[] PROFF;
}

如果我在Java中使用两个字段都将其作为字节[]创建了一个类Params,则杰克逊映射器会将它们视为二进制数组并按以下示例进行编码

{"id":2,"method":"Authenticate","params":["bSwY+kKRO7sIJNZFG/L3dK2ke1kIDwzyK5n717MyBG1pnRhjqSF0kRMAyEqLYKA6VBwujaR8K/wr98+G1Av9vQ12soFi+3DViPN4YDguqF0=","2iNJ5UEK3eVxFTEUHMN04QM8WtNrwGSIu1hKVXFMVvQ="]}


WebService以逗号分隔的非负字节值形式保护这些参数,例如

[truncated] {"id":2,"method":"Authenticate","params":[[114,109,104,101,70,88,16,32,102,17,117,3,105,104,112,4,39,103,11,54,90,106,90,69,26,20,5,10,121,52,108,64,106,102,52,124,87,8,21,29,28,119,110,70,122,33,105, ...............


我得出的结论是,杰克逊映射器使用某种自动Java类型识别并选择相应的JSON类型。有没有一种方法可以控制它,即更改序列化程序用于特定Java类型序列化的类型? Java和JSON类型之间的描述和映射在哪里?

问候

最佳答案

Jackson将byte []表示为以64为基数的字符串。

您需要实现一个自定义的序列化程序,以手动遍历byte []并生成整数值的JSON数组。



这并没有达到我预期的效果。

import java.io.IOException;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.module.SimpleModule;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(new Bar()));
    // output: {"bytes":"AQIDBAUGBwgJCgsMDQ4PEA=="}

    SimpleModule module = new SimpleModule("byte[] as integers", Version.unknownVersion());
    module.addSerializer(byte[].class, new ByteArrayAsIntegersSerializer());
    mapper = new ObjectMapper().withModule(module);
    System.out.println(mapper.writeValueAsString(new Bar()));
    // output: {"bytes":"AQIDBAUGBwgJCgsMDQ4PEA=="}
    // ByteArrayAsIntegersSerializer was not used!

    module = new SimpleModule("byte[] as integers 2", Version.unknownVersion());
    module.addSerializer(Bar.class, new BarSerializer());
    mapper = new ObjectMapper().withModule(module);
    System.out.println(mapper.writeValueAsString(new Bar()));
    // output: {"bytes":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]}
  }
}

class Bar
{
  public byte[] bytes = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
}

class BarSerializer extends JsonSerializer<Bar>
{
  @Override
  public void serialize(Bar value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException
  {
    jgen.writeStartObject();
    jgen.writeFieldName("bytes");
    jgen.writeStartArray();
    for (byte b : value.bytes)
      jgen.writeNumber(b);
    jgen.writeEndArray();
    jgen.writeEndObject();
  }
}

class ByteArrayAsIntegersSerializer extends JsonSerializer<byte[]>
{
  @Override
  public void serialize(byte[] bytes, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException
  {
    jgen.writeStartArray();
    for (byte b : bytes)
      jgen.writeNumber(b);
    jgen.writeEndArray();
  }
}

10-07 18:54
查看更多