我必须用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();
}
}