我必须用Java编写一个代理客户端来连接到JSON WebService。我只有WebService方法和类型的文字描述。例如,一个方法的结果是
Params { byte[] challenge;byte[] proff;}
如果我在Java语言中创建一个类Params,两个字段都为byte[],jackson映射器会将它们视为二进制数组,并按照以下示例进行编码
{"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, ...............我得出结论,Jackson mapper使用某种自动Java类型识别,并选择相应的JSON类型。有没有办法控制它,也就是改变序列化程序应该用于特定Java类型序列化的类型?Java和JSON类型之间的描述和映射在哪里?
问候
发布于 2011-07-22 22:33:00
Jackson将byte[]表示为base64编码的字符串。
您将需要实现一个自定义序列化程序,以手动迭代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();
}
}https://stackoverflow.com/questions/6789721
复制相似问题