@ 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) ;. Однако это также не будет работать с исходным примером, поскольку оно применяет одну и ту же политику сопоставления имен для всех ситуаций.