首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java jackson json处理器-在Android上的RestTemplate中使用和自动类型转换

java jackson json处理器-在Android上的RestTemplate中使用和自动类型转换
EN

Stack Overflow用户
提问于 2011-07-22 20:04:43
回答 1查看 709关注 0票数 0

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

Params { byte[] challenge;byte[] proff;}

如果我在Java语言中创建一个类Params,两个字段都为byte[],jackson映射器会将它们视为二进制数组,并按照以下示例进行编码

代码语言:javascript
复制
{"id":2,"method":"Authenticate","params":["bSwY+kKRO7sIJNZFG/L3dK2ke1kIDwzyK5n717MyBG1pnRhjqSF0kRMAyEqLYKA6VBwujaR8K/wr98+G1Av9vQ12soFi+3DViPN4YDguqF0=","2iNJ5UEK3eVxFTEUHMN04QM8WtNrwGSIu1hKVXFMVvQ="]}

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

代码语言:javascript
复制
[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类型之间的描述和映射在哪里?

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-22 22:33:00

Jackson将byte[]表示为base64编码的字符串。

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

这并没有像我预期的那样工作。

代码语言:javascript
复制
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();
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6789721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档