2016-04-25 31 views
0

JEEアプリケーションでJackson JAXRS JSONプロバイダを使用しています。Jackson JAXRSプロバイダを使用してDynaBeanのLazyDynaListをシリアライズ

compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.7.3' 

私は、各?DynaBeanインスタンスであるList<?>を送信する必要があります。

すなわち:

public List<?> findXXX() { 
    DynaClass dynaClass = new BasicDynaClass("Car", null, new DynaProperty[]{ 
     new DynaProperty("wheels", Long.TYPE), 
     new DynaProperty("doors", Long.TYPE)} 
    } 
    ); 

    try { 
     DynaBean car = dynaClass.newInstance(); 
     car.set("wheels", 4); 
     car.set("doors", 2); 
    } 
    // ... 

    List<DynaBean> cars = new LazyDynaList(dynaClass); 
    cars.add(car); 

    return cars; 
} 

私はこのList<?>送信する場合:私はしたい

[ 
    { 
     "dynaClass":{ 
      "dynaBeanClass":"org.apache.commons.beanutils.LazyDynaBean", 
      "name":"org.apache.commons.beanutils.LazyDynaClass", 
      "restricted":false, 
      "returnNull":false, 
      "dynaProperties":[ 
       { 
        "name":"wheels", 
        "type":"java.lang.Long", 
        "mapped":false, 
        "indexed":false 
       }, 
       { 
        "name":"doors", 
        "type":"java.lang.Long", 
        "mapped":false, 
        "indexed":false 
       } 
      ] 
     }, 
     "map":{ 
      "wheels": 4, 
      "doors": 2 
     } 
    } 
] 

:応答を建てた後

public class SearchEndpoint implements ISearchEndpoint 
{ 

    @Inject protected SearchService searchService; 

    @Override 
    public Response search(String lqlSentence) 
    { 
     return Response.ok().entity(
      this.searchService.findXXX() 
     ).build(); 
    } 
} 

を通り、ジャクソンは、このコンテキストをシリアライズ送信専用:

[ 
    { 
     "wheels": 4, 
     "doors": 2 
    } 
] 

アイデア?

答えて

1

あなたのDynaClass用に独自のカスタムJSONシリアライザを作成しようとしないのはなぜですか?

カスタムシリアライザは、次のようになります。

import java.io.IOException; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerator; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.JsonSerializer; 
import org.codehaus.jackson.map.SerializerProvider; 

public class DynaSerializer extends JsonSerializer<DynaClass> { 

    @Override 
    public void serialize(DynaClass dyna, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     jgen.writeStartObject(); 
     jgen.writeObject(dyna.getMap()); 
     jgen.writeEndObject(); 

    } 

} 

そして、あなたのDynaClassで、独自のカスタムシリアライザを使用しているとJacksonに伝えます。その後、

@JsonSerialize(using=DynaSerializer.class) 
public class DynaClass{ 
//Your class definition 
} 

そして、あなたのJSON文字列...

String jsonStr = new ObjectMapper().writeValueAsString(new DynaClass()); 

そして、より多くのソリューションのために取得することは、超便利です。このリンクでご確認ください。 http://www.baeldung.com/jackson-custom-serialization

関連する問題