2015-05-14 2 views
0

У меня есть объект JSON, хранящийся в db в виде строки. Я использую его для создания динамической формы в пользовательском интерфейсе. Теперь проблема в том, что я хочу изменить некоторые значения в ней на основе других изменений, происходящих в приложении. Поэтому предположим, что я обновил ярлык для поля, тогда мне нужно получить этот JSON и изменить его здесь. Это было бы легко, если я хранится тот же тип объектов в этом формате JSON, но мой JSON походит следующим образом:Преобразование JSON объектов другого типа в java Объект списка

[{ 
    "name": "someName", 
    "xtype": "keyvaluecombo", 
    "fieldLabel": "Some Title", 
    "refType": "YES_NO", 
    "multiSelect": false, 
    "helpText": "" 
    }, 
    { 
    "name": "someName2", 
    "xtype": "keyvaluecombo", 
    "fieldLabel": "Some Title2", 
    "refType": "YES_NO", 
    "multiSelect": false, 
    "helpText": "" 
    }, 
    { 
    "xtype": "datefield", 
    "fieldLabel": "Joining Date", 
    "name": "joiningDate", 
    "submitFormat": "Y-m-d" 
    }, 
    { 
    "xtype": "userselectioncombo", 
    "fieldLabel": "Selection", 
    "name": "selections", 
    "filterBy": { 
     "functions": [ 
     "select" 
     ] 
    } 
    }] 

Теперь это хранится в виде строки в БД, что является эффективным способом изменения fieldLabel на основе имени , Я мог бы попробовать работать над ним только как строку и использовать регулярное выражение, но это было не так.

+3

'есть объект JSON, хранящийся в db в виде строки. Это абсолютно ужасный дизайн. Если вы ДОЛЖНЫ это сделать, вы должны использовать базу данных, поддерживающую json, такую ​​как postgres. – Falmarri

+0

Извлеките JSON, используйте синтаксический анализатор, чтобы получить словарь от него, измените значение, переведите словарь в строку JSON и сохраните его. Или используйте БД, чем известный JSON. –

+0

@ Тиходрома, пожалуйста, уточните – kavinder

ответ

1

Вы должны написать класс компонента, который должен быть отображение вам объект Json как,

public class abc { 

    private String name; 
    private String xtype; 
    private String fieldLabel; 
    ........ 
} 

Тогда вы должны использовать

import java.lang.reflect.Type; 

GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 

Type type = new TypeToken<List<abc>>() { 
      }.getType(); 

List<abc> abcList = gson.fromJson(confTemplate, 
        type); // confTemplate is your Json object you get from DB 

this will get the list of beans. 

for (abc abcData : abcList) { 
// you can do your stuff 
} 
+0

Это просто создание объекта. Как вы будете манипулировать строкой JSON, которая хранится в БД? –

+0

Я тоже так думал, но после моих изменений я должен сохранить его обратно в db в том же формате, что добавит все поля ко всем отдельным jsons. Я имею в виду, что после этого все они будут иметь один и тот же объект, т. Е. Abc. – kavinder

+0

@Tichodroma, как только вы получите отдельные объекты bean-объектов, вы можете сделать свою манипуляцию и, наконец, преобразовать список обратно в JSon до того, как DB сохранит –

0

Прежде всего наилучшим образом, изменение структуры базы данных с новой, которая подходит вашей модели. Не помещать json в вашу базу данных в виде столбца. Но если вы не можете этого сделать, потому что иногда невозможно изменить старые проекты db, вы можете проследить следующий путь.

И, конечно же, вы должны прочитать свой json из db перед запуском и сохранить его снова после процесса ниже.

  1. Создайте пользовательский объект, соответствующий вашей модели.

    public class MyObject{ 
    private String name; 
    private String fieldLabel; 
    
    public String getFieldLabel(){ 
        return fieldLabel; 
    } 
    
    public void setFieldLabel(String fieldLabel){ 
        this.fieldLabel = fieldLabel; 
    } 
    
    public String getName(){ 
        return name; 
    } 
    
    public void setName(String name){ 
        this.name = name; 
    } 
    
    // bla bla other fields 
    
  2. Преобразование JSON в свой объект, и наоборот увидеть пример кода ниже:

public static void main(String[] args){ 
     Gson gson = new Gson(); 
     String yourJson = "[{'name':'someName','xtype':'keyvaluecombo','fieldLabel':'Some Title','refType':'YES_NO','multiSelect':false,'helpText':''},{'name':'someName2','xtype':'keyvaluecombo','fieldLabel':'Some Title2','refType':'YES_NO','multiSelect':false,'helpText':''},{'xtype':'datefield','fieldLabel':'Joining Date','name':'joiningDate','submitFormat':'Y-m-d'},{'xtype':'userselectioncombo','fieldLabel':'Selection','name':'selections','filterBy':{'functions':['select']}}]"; 

     // changing single quotes with double ones. 
     yourJson = yourJson.replaceAll("'", "\""); 

     JsonArray jsonArray = new JsonParser().parse(yourJson).getAsJsonArray(); 

     List<MyObject> result = new ArrayList<MyObject>(); 

     for(JsonElement jsonElement : jsonArray){ 
      MyObject myObject = gson.fromJson(jsonElement, MyObject.class); 

      // change fields as you wish 
      if(myObject.getName().equals("someName")){ 
       myObject.setFieldLabel("TEST"); 
      } 

      // add it to another list 
      result.add(myObject); 
     } 

     // convert into another json again.. 
     System.out.println(gson.toJson(result)); 

    } 
0

Легко понять, что объект в списке имеют атрибуты ниже:

"name" 
"xtype" 
"fieldLabel" 
"refType" 
"multiSelect" 
"helpText" 
"submitFormat" 
"filterBy" 

Таким образом, вы можете создать объект с атрибутами. Использование ObjectMapper для десериализации списка:

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, new TypeReference<ArrayList<T>>() {}) 

После есть список объектов вы можете петельку для изменения любого атрибута или изменить атрибут конкретного элемента, который вы хотите.

+0

проблема с вашим решением заключалась в том, что поля являются динамическими, нет уверенности в том, что они будут единственными атрибутами. Однако вы были близки – kavinder

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