当前位置: 首页 > 面试题库 >

用GSON在字符串和字节[]之间转换JSON

戚正业
2023-03-14
问题内容

我正在使用hibernate将对象映射到数据库。客户端(iOS应用程序)向我发送JSON格式的特定对象,我使用以下实用程序方法将其转换为真实的表示形式

/**
     * Convert any json string to a relevant object type
     * @param jsonString the string to convert
     * @param classType the class to convert it too
     * @return the Object created
     */
    public static <T> T getObjectFromJSONString(String jsonString, Class<T> classType) {

        if(stringEmptyOrNull(jsonString) || classType == null){
            throw new IllegalArgumentException("Cannot convert null or empty json to object");
        }

        try(Reader reader = new StringReader(jsonString)){
            Gson gson = new GsonBuilder().create();
            return gson.fromJson(reader, classType);
        } catch (IOException e) {
            Logger.error("Unable to close the reader when getting object as string", e);
        }
        return null;
    }

但是问题是,在我的pogo中,我将值存储为byte [],如下所示(因为这是存储在数据库中的内容-blob)

@Entity
@Table(name = "PersonalCard")
public class PersonalCard implements Card{

    @Id @GeneratedValue
    @Column(name = "id")
    private int id;

    @OneToOne
    @JoinColumn(name="userid")
    private int userid;

    @Column(name = "homephonenumber")
    protected String homeContactNumber;

    @Column(name = "mobilephonenumber")
    protected String mobileContactNumber;

    @Column(name = "photo")
    private byte[] optionalImage;

    @Column(name = "address")
    private String address;

当然,现在转换失败了,因为它无法在byte []和String之间进行转换。

这是更改构造函数以接受String而不是字节数组,然后在设置字节数组值的同时自己进行转换的最佳方法,还是有更好的方法做到这一点?

引发的错误如下:

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY,但位于第1行第96列的路径$
.optionalImage

谢谢

编辑 实际上,由于GSON生成对象的方式,即使我建议的方法也行不通。


问题答案:

您可以使用此适配器在base64中序列化和反序列化字节数组。这是内容。

   public static final Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class,
            new ByteArrayToBase64TypeAdapter()).create();

    // Using Android's base64 libraries. This can be replaced with any base64 library.
    private static class ByteArrayToBase64TypeAdapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {
        public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            return Base64.decode(json.getAsString(), Base64.NO_WRAP);
        }

        public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP));
        }
    }

归功于作者Ori
Peleg



 类似资料:
  • 问题内容: 我正在使用休眠将对象映射到数据库。客户端(iOS应用程序)向我发送了JSON格式的特定对象,我使用以下实用程序方法将其转换为真实的表示形式 但是问题是,在我的pogo中,我将值存储为byte [],如下所示(因为这是存储在数据库中的内容-blob) 当然,现在转换失败了,因为它无法在byte []和String之间进行转换。 这是更改构造函数以接受String而不是字节数组,然后在设置

  • 问题内容: 是否存在一种普遍接受的技术,可以有效地将JavaScript字符串转换为ArrayBuffers,反之亦然?具体来说,我希望能够将ArrayBuffer的内容写入并读回。 问题答案: 更新 -五年来,规范中现在有了新方法(请参阅下面的支持),可以使用正确的编码在字符串和类型数组之间进行转换。 TextEncoder 该代表: 该接口表示用于特定方法的编码器,即特定的字符编码,例如, ,

  • 问题内容: 有谁知道如何将a转换为Base64字符串,然后将其反转? 我有以下代码;编码之前的原始图像是好的,但是编码和解码后我只能得到空白图像。 问题答案: 迅速 首先我们需要有图像的NSData Swift 2.0 >编码 Swift 2.0 >解码 Swift 3.0 >解码 编码方式 : 解码 : 斯威夫特3.0 目标C iOS7>版本 您可以使用 编码方式 : 解码 : iOS 6.1和

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 我正在与Scribbler2机器人和Fluke2板工作,并通过Java中的Myro与Fluke沟通。Fluke board是Scribbler和用Java编写的桌面客户端之间的蓝牙通信桥梁。它通过一个RS232串口与涂写器通信。 这可能是一个愚蠢的问题,上面的系统很复杂,所以如果我不能很好地解释这一点,请原谅我。 我的问题的背景:Java使用有符号字节。Fluke是(我想)用C写的,所以使用了无符

  • 我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页