将不同类型对象的JSON转换为java列表对象
我有一个JSON对象以字符串的形式存储在db中。我正在使用它在UI中创建动态表单。现在的问题是,我想根据应用程序上发生的其他更改来更改其中的一些值。所以假设我更新了字段的标签,那么我必须得到这个JSON并在这里更改它。 如果我在这个json中存储了相同类型的对象,这将很容易,但我的json如下所示:将不同类型对象的JSON转换为java列表对象,java,json,string,Java,Json,String,我有一个JSON对象以字符串的形式存储在db中。我正在使用它在UI中创建动态表单。现在的问题是,我想根据应用程序上发生的其他更改来更改其中的一些值。所以假设我更新了字段的标签,那么我必须得到这个JSON并在这里更改它。 如果我在这个json中存储了相同类型的对象,这将很容易,但我的json如下所示: [{ "name": "someName", "xtype": "keyvaluecombo", "fieldLabel": "Some Title", "refTy
[{
"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的有效方法是什么。我本可以尝试将其作为字符串处理并使用正则表达式,但感觉不太对劲 您应该编写一个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
}
import java.lang.reflect.Type;
GsonBuilder GsonBuilder=新的GsonBuilder();
Gson-Gson=gsonBuilder.create();
Type Type=new-TypeToken(){
}.getType();
List abcList=gson.fromJson(confTemplate,
类型);//confTemplate是您从DB获得的Json对象
这将获得bean列表。
对于(abc abcData:abcList){
//你可以做你的事
}
首先,最好的方法是使用适合您的模型的新数据库设计来更改您的数据库设计。不将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
publicstaticvoidmain(字符串[]args){
Gson Gson=新的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':'joiningDate','name':'joiningDate','submitFormat':'Y-m-d'},{'xtype':'userselectioncombo','fieldLabel':'Selection','name':'selections','filterBy':{'functions':['select']}];
//将单引号更改为双引号。
yourJson=yourJson.replaceAll(“'”,“\”);
JsonArray JsonArray=new-JsonParser().parse(yourJson.getAsJsonArray();
列表结果=新建ArrayList();
for(JsonElement JsonElement:jsonArray){
MyObject MyObject=gson.fromJson(jsonElement,MyObject.class);
//根据需要更改字段
if(myObject.getName().equals(“someName”)){
myObject.setFieldLabel(“测试”);
}
//将其添加到另一个列表中
结果:添加(myObject);
}
//再次转换为另一个json。。
System.out.println(gson.toJson(result));
}
很容易认识到列表中的对象具有以下属性:
"name"
"xtype"
"fieldLabel"
"refType"
"multiSelect"
"helpText"
"submitFormat"
"filterBy"
因此,您可以创建具有超过个属性的对象。使用ObjectMapper反序列化列表:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<ArrayList<T>>() {})
ObjectMapper mapper=new ObjectMapper();
readValue(json,新类型引用(){})
拥有列表对象后,您可以循环更改任何属性或您想要更改的特定项的属性。`将JSON对象以字符串的形式存储在数据库中',这绝对是一种糟糕的设计。如果必须这样做,您应该使用具有JSON支持的数据库,如PostgresTract JSON,使用解析器获取字典fr对它,更改值,将字典序列化回JSON字符串,保存它。或者使用DB than known JSON。@Tichodroma你能详细说明哪一部分吗?我的主要建议是使用DB than knows JSON作为数据类型,PostgreSQL会,AFAIK。如果你不想使用关系数据库,请使用NoSQL数据库,如MongoDB。这只是创造性的g对象。您将如何操作存储在DB中的JSON字符串?我也这样想,但在我的更改完成后,我必须以相同的格式将其存储回DB,这将把所有字段添加到所有单独的JSON中。我的意思是,在这之后,它们都将是相同的对象,即abc。@Tichodroma,一旦您获得单独的bean对象,您就可以使用c执行操作并最终在DB之前将列表转换回JSonsave@kavinder,完成操作后,可以使用gson.toJson(abcList)将列表转换回json然后将其保存到数据库中。解决方案的问题是字段是动态的,无法保证这些字段将是唯一的属性。但是,您的答案很接近