2011-07-22 19 views
0

JSON WebServiceに接続するためにJavaでプロキシクライアントを作成する必要があります。私は、WebServiceのメソッドと型のテキスト記述のみを持っています。例えば、1つの方法の結果は、java jackson json processor - AndroidのRestTemplateと自動タイプ変換で使用

パラメタ{ バイト[チャレンジ]です。 バイト[] proff;私はバイト[]の両方のフィールドとJavaでクラスPARAMSを作成する場合 }

、ジャクソンマッパーは、バイナリ配列としてそれらを扱い、WebServiceがの形でこれらのパラメータをexptects

{"id":2,"method":"Authenticate","params":["bSwY+kKRO7sIJNZFG/L3dK2ke1kIDwzyK5n717MyBG1pnRhjqSF0kRMAyEqLYKA6VBwujaR8K/wr98+G1Av9vQ12soFi+3DViPN4YDguqF0=","2iNJ5UEK3eVxFTEUHMN04QM8WtNrwGSIu1hKVXFMVvQ="]} 

次の例のように符号化しますコンマ

[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, ............... 

ような非負のバイト値を分離Iジャクソンマッパー自動Java型認識のいくつかの種類を使用し、対応するJSONのタイプを選択すると結論づけました。シリアライザが特定のJava型のシリアライゼーションに使用する型を変更する方法がありますか? JavaとJSON型の間の記述とマッピングはどこですか?

よろしく

答えて

1

ジャクソンはベース64符号化された文字列として[]バイトを表しています。

バイト[]を手動で繰り返し、整数値の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(); 
    } 
} 
関連する問題