2016-07-29 88 views
0

如何從String中獲取List對象,添加列表中的新元素並將其重新設置爲字符串。我使用JSON和傑克遜,創建類名單的元素:Java字符串到對象的列表

public class WeightDataJson { 
     private String weightValue; 
     private String dateValue; 
     public WeightDataJson(String weightValue,String dateValue){ 
      this.weightValue=weightValue; 
      this.dateValue=dateValue; 
     } 
     public String getWeightValue() { 
      return weightValue; 
     } 
     public void setWeightValue(String weightValue) { 
      this.weightValue = weightValue; 
     } 
     public String getDateValue() { 
      return dateValue; 
     } 
     public void setDateValue(String dateValue) { 
      this.dateValue = dateValue; 
     } 
    } 

和我的改變列表代碼和字符串:

   String myWeightData = preferencesWeight.get(); 
       List<WeightDataJson> myList = new Vector<WeightDataJson>(); 
       ObjectMapper jsonMapper = new ObjectMapper(); 
       try { 
        myList = jsonMapper.readValue(myWeightData, new TypeReference<List<WeightDataJson>>(){}); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       WeightDataJson newWeightData = new WeightDataJson(editText.getText().toString(),"213123"); 
       myList.add(newWeightData); 

       JSONObject myJson=new JSONObject(); 
       for(int i=0;i<myList.size();i++){ 
        try { 
         myJson.put("weightValue",myList.get(i).getWeightValue()); 
         myJson.put("dateValue",myList.get(i).getDateValue()); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 

       String toSave ="["+myJson.toString()+"]"; 
       Toast.makeText(getActivity(),"zapisuje: "+toSave,Toast.LENGTH_LONG).show(); 
       preferencesWeight.save(toSave); 
       WeightDataProvider weightDataProvider = new WeightDataProvider(addIcon,deleteIcon,editText.getText().toString(),"213123"); 
       weightAdapter.add(weightDataProvider); 

myWeightData是「基本」字符串(這是可能的,它是空的) ,我不知道,但可能有問題,因爲jakcson字符串必須像[{element1},{element2}]和Json對象給{element1},{element2}所以我把那裏String toSave ="["+myJson.toString()+"]"

如果基本的字符串是[{weightValue":"50","dateValue":"34234"}]我有一個錯誤的行myList=jsonmapper.readValue~~

07-30 03:59:04.407 11837-11837/com.plan.aplikacjamobilna W/System.err: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.plan.aplikacjamobilna.WeightDataJson]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?) 
07-30 03:59:04.407 11837-11837/com.plan.aplikacjamobilna W/System.err:  at [Source: [{"weightValue":"14","dateValue":"213123"}]; line: 1, column: 3] (through reference chain: java.util.ArrayList[0]) 

有另一種方式來解決我的問題呢?

+0

您是否嘗試過加入一個默認的構造類似的錯誤消息說,它缺少? – azurefrog

+0

你的意思是WeightDataJson的構造函數嗎? – barmi

+0

是的。您尚未爲該類定義默認構造函數,並且如果您已經定義了任何自己的類,java將不會自動創建一個。我期望傑克遜正在嘗試創建一個空白對象,然後向其中注入值,而這是默認構造函數無法實現的。 – azurefrog

回答

1

如果你想存儲數據爲字符串爲什麼你複雜的事情,並涉及其他不必要的類和對象?

  1. 覆蓋toString()方法在類

    一個)選擇的數據(變量)delimiter1「:」

    B)串聯爲類記錄數據(變量),使用delimiter1

  2. 使構造函數的String參數爲:

    一)分裂與以前用過的delimiter1級聯串

    b)中分配結果[]分裂到聲明的變量

  3. 使靜態方法:

    A)列出<>爲參數來連接各對象toString()方法產生的字符串與delimiter2「%」實現這樣的事情:

    "var1o1:var2o1%var1o2:var2o2%var1o3:var2o3" etc 
    

    二)拆分上述字符串:

    b.a/ delimieter2 - > then result each String pass to object to split with 
    
    b.b/ delimieter1 -> then result [] of split assign to variables 
    
+0

嗯我第一次這樣做,即時通訊不知道應該在toString()方法,你能幫我嗎? – barmi

+1

@barmi我建議你不要使用toString()來實現序列化。 toString()應該是你的類實例的人類可讀表示,通常不應該被你的應用程序邏輯智能地解析。 – nasukkin

0

您可以使用GSON你的類型和字符串之間進行切換。用法:

build。gradle這個

compile 'com.google.code.gson:gson:2.7' 

從POJO到字符串:

Gson gson = new Gson(); 
String json = gson.toJson(weightData); 

從字符串到POJO:

WeightDataJson newWeightData = gson.fromJson(json, WeightDataJson.class); 

編輯:

隨着ArrayList中

List<WeightDataJson> list = new ArrayList<WeightDataJson>(); 
list.add(obj1); 
list.add(obj2); 
list.add(obj3); 
.. 
Type type = new TypeToken<List<WeightDataJson>>() {}.getType(); 
String json = gson.toJson(list, type); 
List<WeightDataJson> newWeightData = gson.fromJson(json, type); 
+0

OP沒有試圖解析一個'WeightDataJson',而是'WeightDataJson'的'List'。 – azurefrog