@ user523392 は言いました:
メンバー変数は、JSON 応答で指定されたものと正確に一致する必要があります
これはそうではありません。
Java フィールド名を JSON 要素名にマップする方法を指定するためのオプションがいくつかあります。
上記の元の質問の場合に有効な解決策の 1 つは、Java クラス メンバーに@SerializedNameのアノテーションを付けて、マッピング先の JSON 要素名を非常に明示的に宣言することです。
// output: [MyObject: element=value1, elementTwo=value2]
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
public class Foo
{
static String jsonInput =
"{" +
"\"element\":\"value1\"," +
"\"@element-two\":\"value2\"" +
"}";
public static void main(String[] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
MyObject object = gson.fromJson(jsonInput, MyObject.class);
System.out.println(object);
}
}
class MyObject
{
String element;
@SerializedName("@element-two")
String elementTwo;
@Override
public String toString()
{
return String.format(
"[MyObject: element=%s, elementTwo=%s]",
element, elementTwo);
}
}
もう 1 つの方法は、FieldNamingStrategy
Java メンバー名を JSON 要素名に変換する方法を指定するカスタムを作成することです。この例では、すべての Java メンバー名に同じ名前マッピングを適用します。すべての JSON 要素名が同じ命名パターンに従っているわけではないため、このアプローチは上記の元の例では機能しません。すべてが「@」で始まるわけではなく、名前部分を「-」で区切る代わりにキャメル ケースの命名を使用するものもあります。 '。このインスタンスは、インスタンス ( )FieldNamingStrategy
を構築するときに使用されます。Gson
gsonBuilder.setFieldNamingStrategy(new MyFieldNamingStrategy());
class MyFieldNamingStrategy implements FieldNamingStrategy
{
// Translates the field name into its JSON field name representation.
@Override
public String translateName(Field field)
{
String name = field.getName();
StringBuilder translation = new StringBuilder();
translation.append('@');
for (int i = 0, length = name.length(); i < length; i++)
{
char c = name.charAt(i);
if (Character.isUpperCase(c))
{
translation.append('-');
c = Character.toLowerCase(c);
}
translation.append(c);
}
return translation.toString();
}
}
Java フィールド名を JSON 要素名にマップする方法を管理するもう 1 つの方法は、インスタンスのFieldNamingPolicy
構築時に を指定することです。ただし、これも元の例では機能しません。同じ名前マッピング ポリシーがすべての状況に適用されるためです。Gson
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);