2016-07-29 2 views
0

Как можно получить объект List из String, добавить новый элемент в список и вернуть его в строку. Я использую 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 является «основными» String (это возможно, что он пуст) , Я не уверен, но, вероятно, есть проблема, потому что String для 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":"

    б) конкатенации данные для записей класса (переменных) с использованием Delimiter1

  2. сделать конструктор со значением параметра String до:

    а) разделение каскадной строки с предыдущей использованной Delimiter1

    б) назначить результат [] раскол объявленных переменных

  3. сделать статические методы:

    а) Список <> в качестве параметра для конкатенации каждого метод объекта 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 для переключения между типом и String. Использование:

сборка.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); 

EDIT:

С 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», а «List» из «WeightDataJson». – azurefrog

Смежные вопросы