1

サンプルクラスがあります

public class Category {
private String id ;
    private String name ;

private String description ;

private String image ;

private String thumbnail ;
 private Map<String, String> custom ;
}

以下の形式でサーバーからの応答がありますが、例として、これがファイル cat.json にあるとしましょう

{"id":"mens","name":"Mens","c__showInMenu":true,"c__enableCompare":false}

   1 ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
   2 Category cat= mapper.readValue(new File("cat.json"), Category.class);

これは、id、name などのフィールドに対して完全に正常に機能します。 で始まる json のフィールドがc_Map カスタムにプッシュされるように、カスタム デシリアライザーを作成するにはどうすればよいですか?

私はJacksonを初めて使用し、Springs Rest Templateを使用しており、使用するように構成しています org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.

4

2 に答える 2

2

を単に利用したい場合があり@JsonAnySetterます。

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
    Category category = mapper.readValue(new File("cat.json"), Category.class);
    System.out.println(category);
    // output:
    // Category: id=mens, name=Mens, description=null, image=null, thumbnail=null, custom={c__showInMenu=true, c__enableCompare=false}
  }
}

class Category
{
  private String id;
  private String name;
  private String description;
  private String image;
  private String thumbnail;
  private Map<String, String> custom;

  @JsonAnySetter
  void addSomething(String name, String value)
  {
    if (custom == null) custom = new HashMap();
    custom.put(name, value);
  }

  @Override
  public String toString()
  {
    return String.format("Category: id=%s, name=%s, description=%s, image=%s, thumbnail=%s, custom=%s", 
        id, name, description, image, thumbnail, custom);
  }
}
于 2012-01-03T05:10:16.620 に答える
0

それは可能ですが、私が考えることができる唯一の方法は、「クリーンで完璧」であるとはほど遠いことです。 最後の手段として、使用する前にJacksonのドキュメントを掘り下げることをお勧めします。

あなたができることは、次のように、シリアル化されたオブジェクトのすべてのプロパティを保持するマップフィールドを持つクラスを作成することです。

public class CustomObject {
    private Map<String,Object> map;
}

そうすれば、ジャクソンはそのようなオブジェクトを解析できます。

{ map : {"id":"mens","name":"Mens","c__showInMenu":true,"c__enableCompare":false}}

これで、逆シリアル化を台無しにする望ましくない「マップ」ラッパーがまだあります。1つの解決策は、着信JSONコンテンツを「{map:」と終了タグ「}」で囲むことです。

そうすれば、Jacksonはオブジェクトを適切にマップし、すべてのプロパティのマップを作成し、それを反復処理して、おかげでチェックタイプinstanceofを取得し、すべてのデータを取得できます。

繰り返しになりますが、これは最善の方法ではない可能性があるため、最初にクリーンなソリューションを試す必要があります。私はジャクソンの専門家ではないので、あなたをより良い方向に向けることはできません。

于 2012-01-02T09:35:57.343 に答える