gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:47:46 25 4
gpt4 key购买 nike

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

参数{字节[]挑战;字节[]教授;}

如果我在 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 类型之间的描述和映射在哪里?

问候

最佳答案

Jackson 将 byte[] 表示为 Base 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();
}
}

关于java jackson json 处理器 - 在 Android 上的 RestTemplate 中使用和自动类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6789721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com