如何在Java中将JSON转换为Base64字符串?

时间:2018-01-18 15:08:36

标签: java android json

我有一个JsonObject(Gson)我想在将它发送到服务器之前用Aes256加密这个json,所以我必须先将其转换为Base64

JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("command", "abc");


String body = Base64.encodeToString(jsonObject.toString().getBytes("UTF-8"), Base64.NO_WRAP);

String finalBody = aesKeyIv.encrypt(body);

然而,它发送格式错误的json,因为它无法正确转换。

编辑:这适用于Android

我的加密方法:

 public String encrypt(String value) throws Exception {
        byte[] encrypted = cipherEnc.doFinal(value.getBytes());
        return Base64.encodeToString(encrypted, Base64.NO_WRAP);
    }

3 个答案:

答案 0 :(得分:1)

你可以使用Bouncy Castle& Apache Commons api转换为Base64,但确保您有相同的算法用于编码和解码。

答案 1 :(得分:0)

您可以导入库:

import org.apache.commons.codec.binary.Base64;

然后您可以使用以下代码编码到Base64:

public byte[] encodeBase64(String encodeMe){
byte[] encodedBytes = Base64.encodeBase64(encodeMe.getBytes());
return encodedBytes ;
} 

用于解码,您可以使用

public String decodeBase64(byte[] encodedBytes){
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
return new String(decodedBytes)
}

如果你使用的是 Java 8 ,那么你可以将Base64类直接用于包中:

import java.util.Base64; 

您编码到Base64的代码将更改为:

public String encodeBase64(byte [] encodeMe){
    byte[] encodedBytes = Base64.getEncoder().encode(encodeMe);
    return new String(encodedBytes) ;
    } 

并且类似地,您的新解码将更改为

public byte[]decodeBase64(String encodedData){
    byte[] decodedBytes = Base64.getDecoder().decode(encodedData.getBytes());
    return decodedBytes ;
    }

答案 2 :(得分:0)

byte[]值(如加密值)应为Base64编码。

        String aesIv2EncryptedString = Base64.encodeToString(aesIv2Encrypted,
            Base64.NO_WRAP);
        jsonObject.addProperty("asIv", aesIv2EncryptedString);

这使得整个JSON可读UTF-8文本具有文本值,因为Base64提供了二进制数据的ASCII子集。

encrypt方法与完美一样好,只有String.getBytes()(在许多示例中看​​到)会使用平台编码;当该软件在Windows上运行时,该编码不是UTF-8,而是一些非Unicode(= 256 char子集)编码。因此字符将是不可转换的(“?”)和乱码。所以跨平台可能是:

public String encrypt(String value) throws Exception {
    byte[] encrypted = cipherEnc.doFinal(value.getBytes("UTF-8"));
    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

解密时:

byte[] originalValue = ...;
return new String(originalValue, "UTF-8");