[英]Convert a JSON of different type of objects into java List object
我有一個以字符串形式存儲在db中的JSON對象。 我正在使用它在UI中創建動態表單。 現在的問題是,我想根據應用程序上發生的其他更改來更改其中的某些值。 因此,假設我更新了該字段的標簽,那么我必須獲取此JSON並在此處進行更改。 如果我在此json中存儲了相同類型的對象,這將很容易,但是我的JSON如下所示:
[{
"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"
]
}
}]
現在,將其作為String存儲在db中,這是根據名稱更改fieldLabel的有效方法。 我本可以嘗試僅將其作為字符串並使用正則表達式來處理,但這感覺不對。
您應該編寫一個bean類,該類應該映射到您的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
}
首先,最好的方法是,使用適合您的模型的新方法來更改數據庫設計。 不將json作為列保留在數據庫中。 但是,如果您不能這樣做,因為有時無法更改舊的數據庫設計,則可以跟蹤以下方式。
當然,您應該在開始之前從db中讀取json,並在以下過程之后再次保存它。
創建一個適合您的模型的自定義對象。
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
將您的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 ) );
}
容易意識到列表中的對象具有以下屬性:
"name"
"xtype"
"fieldLabel"
"refType"
"multiSelect"
"helpText"
"submitFormat"
"filterBy"
因此,您可以創建一個具有over屬性的Object。 使用ObjectMapper反序列化列表:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<ArrayList<T>>() {})
在擁有列表對象之后,您可以循環更改所需的任何屬性或更改特定項目的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.