33

mimetype と value の 2 つのフィールドを持つ JSON を作成したいと考えています。値フィールドは、値としてバイト配列を取得する必要があります。

{

  "mimetype":"text/plain",

  "value":"dasdsaAssadsadasd212sadasd"//this value is of type byte[]

}

どうすればこのタスクを達成できますか?

現在、toString()メソッドを使用してバイト配列を文字列に変換し、JSON を形成しています。

4

3 に答える 3

45

JSON 解析に Jackson を使用している場合は、byte[]データバインディングを介して Base64 でエンコードされた文字列との間で自動的に変換できます。

または、低レベルのアクセスが必要な場合は、 と の両方JsonParserJsonGeneratorバイナリ アクセス メソッド (writeBinary、readBinary) を使用して、JSON トークン ストリームのレベルで同じことを行います。

自動アプローチの場合、次のような POJO を検討してください。

public class Message {
  public String mimetype;
  public byte[] value;
}

JSON を作成するには、次のようにします。

Message msg = ...;
String jsonStr = new ObjectMapper().writeValueAsString(msg);

または、より一般的には次のように記述します。

OutputStream out = ...;
new ObjectMapper().writeValue(out, msg);
于 2012-07-19T18:02:00.480 に答える
20

次のような独自の CustomSerializer を作成できます。

public class ByteArraySerializer extends JsonSerializer<byte[]> {

@Override
public void serialize(byte[] bytes, JsonGenerator jgen,
        SerializerProvider provider) throws IOException,
        JsonProcessingException {
    jgen.writeStartArray();

    for (byte b : bytes) {
        jgen.writeNumber(unsignedToBytes(b));
    }

    jgen.writeEndArray();

}

private static int unsignedToBytes(byte b) {
    return b & 0xFF;
  }

}

これは、Base64 文字列ではなく、符号なしのバイト配列表現を返します。

POJO での使用方法:

public class YourPojo {

    @JsonProperty("mimetype")
    private String mimetype;
    @JsonProperty("value")
    private byte[] value;



    public String getMimetype() { return this.mimetype; }
    public void setMimetype(String mimetype) { this.mimetype = mimetype; }

    @JsonSerialize(using= com.example.yourapp.ByteArraySerializer.class)
    public byte[] getValue() { return this.value; }
    public void setValue(String value) { this.value = value; }


}

そして、これがその出力の例です:

{
    "mimetype": "text/plain",
    "value": [
        81,
        109,
        70,
        122,
        90,
        83,
        65,
        50,
        78,
        67,
        66,
        84,
        100,
        72,
        74,
        108,
        89,
        87,
        48,
        61
    ]
}

PS: このシリアライザーは、StackOverflow で見つけたいくつかの回答を組み合わせたものです。

于 2013-02-23T05:16:01.690 に答える
3

バイナリ データを文字列に変換するBase64を使用することをお勧めします。ほとんどのプログラミング言語には、base64 エンコーディングとデコーディングの実装があります。ブラウザでデコード/エンコードする場合は、この質問を参照してください。

于 2012-07-18T17:33:44.160 に答える