将不同类型对象的JSON转换为java List对象

时间:2015-05-14 06:48:03

标签: java json string

我有一个以字符串形式存储在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"
      ]
    }
  }]

现在它在db中存储为String,这是根据名称更改fieldLabel的有效方法。我本可以尝试将其作为字符串进行处理并使用正则表达式,但这感觉不对。

3 个答案:

答案 0 :(得分:2)

你应该编写一个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
}

答案 1 :(得分:0)

首先,最好的方法是使用适合您模型的新数据库设计来更改数据库设计。不将json作为列保留在数据库中。但是如果你不能这样做,因为有时候改变旧的数据库设计是不可能的,你可以通过以下方式进行跟踪。

当然你应该在开始之前从db读取你的json并在下面的过程之后再次保存它。

  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转换为您的对象,反之亦然请参阅下面的代码示例:

  3.  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 ) );
    
        }
    

答案 2 :(得分:0)

很容易意识到列表中的对象具有以下属性:

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

因此,您可以创建具有over属性的Object。使用ObjectMapper反序列化列表:

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

拥有列表对象后,您可以循环更改任何属性或更改所需特定项目的属性。