当前位置: 首页 > 知识库问答 >
问题:

用GSON实现JSON在string和Byte[]之间的转换

司马昕
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[]和一个字符串之间进行转换。

这里最好的方法是更改构造函数以接受字符串而不是字节数组,然后在设置字节数组值的同时自己进行转换,或者有没有更好的方法这样做。

抛出的错误如下所示;

com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:应为BEGIN_ARRAY,但在第1行第96列路径$.OptionalImage处为字符串

多谢了。

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

共有1个答案

姜杜吟
2023-03-14

您可以使用此适配器序列化和反序列化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。

 类似资料:
  • String转换到Byte数组时,每个byte(byte类型其实就是uint8)保存字符串对应字节的数值。 注意Go的字符串是UTF-8编码的,每个字符长度是不确定的,一些字符可能是1、2、3或者4个字节结尾。 示例1: package main import "fmt" func main() { s1 := "abcd" b1 := []byte(s1) fmt.Pri

  • 本文向大家介绍详谈C# 图片与byte[]之间以及byte[]与string之间的转换,包括了详谈C# 图片与byte[]之间以及byte[]与string之间的转换的使用技巧和注意事项,需要的朋友参考一下 实例如下: 以上这篇详谈C# 图片与byte[]之间以及byte[]与string之间的转换就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

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

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

  • 本文向大家介绍C#实现Stream与byte[]之间的转换实例教程,包括了C#实现Stream与byte[]之间的转换实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式详细介绍了C#实现Stream与byte[]之间的转换的方法,分享给大家供大家参考之用。具体方法如下: 一、二进制转换成图片 二、C#中byte[]与string的转换代码 1. 2. 三、C# Stream 和 by

  • 问题内容: 之间有什么区别 和 问题答案: 仅当对象 实际上是 字符串时,才强制转换为字符串: 当对象是其他对象时,它将不起作用: 但是,您将尝试将传递给它的任何内容转换为。它使用该对象的来处理原语()和对象(): 请特别注意最后一个示例:传递给将返回字符串。