2016-09-18 2 views
0

Я проверил множество примеров создания класса Model для json, у которого есть пара значений ключа. Но у меня есть следующий тип json, в котором имя поля зависит от значений в json. Пожалуйста, посмотрите ниже json -Модельный класс для json

{ "args" : 
    [{ 
    "name":"fullName", 
    "value":"Vikram", 
    "type":"String" 
    }, 
    { 
    "name":"userName", 
    "value":"[email protected]", 
    "type":"String" 
    } 
    ] 
} 

Может кто-нибудь, пожалуйста, помогите мне в том, как создать класс модели для этого json? Для выше JSON я ожидаю, что моя модель класса должна быть как ниже -

public class Model { 

    private String userName; 
    private String fullName; 
... 


    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String name) { 
     this.userName = name; 
    } 

    public String getFullName() { 
     return fullName; 
    } 

    public void setFullName(String value) { 
     this.fullName = value; 
    } 
} 

Возможно ли это или нет? Я знаю, как создать класс модели для JSON, как -

{ "args" : 
    [{ 
    "fullName":"Vikram", 
    "userName":"[email protected]" 
    } 
    ] 
} 
+0

Вы пробовали этот сайт? http://www.jsonschema2pojo.org –

+0

да, я попробовал, но это не давало мне модельный класс, как я ожидал. –

+0

Почему бы и нет? Например, 'username' и' fullname' не являются ключами в вашем первом примере JSON. Это для второго JSON, но вам также нужен Java-класс с ключом 'args', который хранит список модели –

ответ

0
public class Model { 

    private String name; 
    private String value; 
    private String type; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

} 

использовать этот класс. для хранения данных. создать

List<Model> list =new ArrayList<>(); 

создать класс объектов Модель установить его значение, а затем добавить в список.

+0

Но я ожидаю, что моя модель класса должна быть как - общественного класса Model { частной Струнный имя пользователя; private String fullName; ... public String getUserName() { return userName; } public void setUserName (String name) { это.userName = name; } public String getFullName() { return fullName; } public void setFullName (String value) { this.fullName = value; } } –

+0

@VikramBhati немного запутывает то, что вы на самом деле хотите. можете ли вы разместить один пример json, что именно вы хотите, а не два. Ваш образец json должен содержать весь параметр, который вы хотите сохранить. –

+0

Смотрите, что я хочу сказать. Мне нужен класс (то есть UserInfo), который я буду использовать в своем приложении для доступа к любым полям, таким как имя пользователя, имя_файла. Сейчас я получаю ответ json, который я рассказал выше. Я хочу преобразовать этот ответ json в java-объект (объект userInfo здесь –

1

Создание модели в том виде, в котором вы упомянули, невозможно, поскольку макет не знает во время компиляции. (Java не имеет поставщиков типа)

Возможно удобный способ сериализации в какой-то словарь, но сохранить тип значения:

class Model { 
    private final Map<String, Value> fields = new HashMap<>(); 

    public Value getValue(String fieldName) { 
     return fields.get(fieldName); 
    } 

    public static Model deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { 
     Model ret = new Model(); 

     JsonArray args = json.getAsJsonObject() // Get 'args' array 
      .get("args") 
      .getAsJsonArray(); 

     for(JsonElement e : args) { 
      JsonObject o = e.getAsJsonObject(); 
      ret.fields.put(
       o.get("name").getAsString(), 
       new Value(o.get("type").getAsString(), o.get("value")) 
      ); 
     } 

     return ret; 
    } 
} 
class Value { 
    private final String type; 
    private final JsonElement obj; 

    public Value(String type, JsonElement obj) { 
     this.type = type; 
     this.obj = obj; 
    } 

    public String getType() { 
     return type; 
    } 

    public String getAsString() { 
     return obj.getAsString(); 
    } 
    ... 
} 

Тогда вы можете зарегистрировать этот deserialize метод в качестве адаптера типа:

Gson gson = new GsonBuilder() 
    .registerTypeAdapter(
     Model.class, 
     (JsonDeserializer<Model>) Model::deserialize 
    ).create(); 

String json = ...; 

Model m = gson.fromJson(json, Model.class); 

System.out.println(m.getValue("fullName").getAsString()); // 'Vikram' 
System.out.println(m.getValue("userName").getAsString()); // '[email protected]' 
+0

Спасибо. Это очистило мои сомнения. Хорошо, я попробую этот подход. Но мне было бы трудно получить доступ к этому классу модели в моем приложении. Скажем, я хочу получить доступ к имени пользователя из этого класса, тогда мне нужно будет написать m.getValue («fullName»). Вот как мне нужно будет изменять все вхождения для getUserName() типа getter и seters. Но да, правда, макет не знает во время компиляции. –

Смежные вопросы