@ user523392 сказал:
переменные-члены должны точно соответствовать тому, что указано в ответе JSON
Это не так.
Есть несколько опций для указания того, как имена полей Java отображаются на имена элементов JSON.
Одно решение, которое будет работать для случая в исходном вопросе выше, состоит в том, чтобы аннотировать членов класса 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);
}
}
Другой подход заключается в создании пользовательского 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 заключается в указании FieldNamingPolicy
при создании экземпляра Gson
, например, gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);
.Однако это также не будет работать с исходным примером, поскольку оно применяет одну и ту же политику сопоставления имен для всех ситуаций.