簡體   English   中英

將不同類型的對象的JSON轉換為Java List對象

[英]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,並在以下過程之后再次保存它。

  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 ) );

    }

容易意識到列表中的對象具有以下屬性:

"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM