単一の値を任意の配列に強制したいのですが、これまでのところ、すべての単一の値を配列として変換する唯一の方法が見つかりました。
これは単にそうであってはなりません。ACCEPT_SINGLE_VALUE_AS_ARRAY
プロパティは、特定のObjectMapper に対してオン/オフですが、その動作は、JSON 値がマップされているターゲット プロパティによって完全に制御されます。
- ACCEPT_SINGLE_VALUE_AS_ARRAY がオンの場合、JSON 値を Java コレクション プロパティにマッピングしてもエラーになりません。
- ACCEPT_SINGLE_VALUE_AS_ARRAY がオンの場合、JSON 値を Java 基本プロパティにマッピングしても (また) エラーにはなりません。
次のコードで説明します。
class Foo {
private String msg;
// Constructor, setters, getters
}
class Holder {
private List<Foo> foo;
private Foo other;
// Constructors, setters, getters
}
public class FooTest {
@org.junit.Test
public void testCollectionFromJSONValue() throws Exception {
final InputStream stream = Thread.currentThread()
.getContextClassLoader().getResourceAsStream("foo.json");
final String json = IOUtils.toString(stream);
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(
DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
true);
final Holder holder = mapper.readValue(json, Holder.class);
System.out.println(holder);
}
}
次の JSON に依存します。
{
"foo": {
"msg": "Hello World"
},
"other": {
"msg": "Goodbye"
}
}
コードを実行すると、「foo」プロパティが正常にリストに逆シリアル化され、「other」プロパティが (基本的な) Foo 型に逆シリアル化されることが示されます。