[英]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.