2017-01-25 4 views
0

Я пытался решить эту проблему довольно долго, но у меня, похоже, больше нет маршрута.json недействителен, цитата и обратная косая черта

У меня была некоторая обратная косая черта, которую мне удалось удалить с заменой ("\", ""), но у меня все еще есть какой-то знак цитаты ---> "только в начале моей карты, и я не есть какие-либо идеи, как он получает там

Вот мой код:.

 public void actionPerformed(ActionEvent e) { 
      JsonObject obj = new JsonObject(); 
      JsonArray ingredList = new JsonArray(); 
      Map<String, String> ingredientAsMap = new HashMap<>(); 
      JsonArray prepTime = new JsonArray(); 
      Map<String, String> prepTimeAsMap = new HashMap<>(); 
      JsonArray cookTime = new JsonArray(); 
      Map<String, String> cookTimeAsMap = new HashMap<>(); 

      obj.addProperty("Recipe Name", textField1.getText().toString()); 
      for (int r = 0; r < model.getRowCount(); r++) { 
       ingredientAsMap.put("Ingredient", model.getValueAt(r, 0).toString()); 
       ingredientAsMap.put("Measure", model.getValueAt(r, 1).toString()); 
       ingredientAsMap.put("Quantity", model.getValueAt(r, 2).toString()); 
       ingredList.add(String.valueOf(ingredientAsMap)); 
      } 

      obj.addProperty("Ingredients Lists", String.valueOf(ingredList)); 
      obj.addProperty("Preparation", editorPane1.getText().toString()); 
      prepTimeAsMap.put("Hours", spinner3.getValue().toString()); 
      prepTimeAsMap.put("Mins", spinner2.getValue().toString()); 
      prepTime.add(String.valueOf(prepTimeAsMap)); 
      obj.addProperty("Preparation Time", String.valueOf(prepTime)); 

      cookTimeAsMap.put("Hours", spinner1.getValue().toString()); 
      cookTimeAsMap.put("Mins", spinner4.getValue().toString()); 
      cookTime.add(String.valueOf(cookTimeAsMap)); 
      obj.addProperty("Cooking Time", String.valueOf(cookTime)); 

      Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); 
      String json = gson.toJson(obj).replace("\\", ""); 
      try{ 
       FileWriter writer = new FileWriter(System.getProperty("user.dir") + "\\" + textField1.getText().toString() + ".json"); 
       BufferedWriter bw = new BufferedWriter(writer); 

       bw.write(json); 
       bw.close(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

      System.out.println(json); 
      //System.out.println(System.getProperty("user.dir") + "\\" + textField1.getText().toString() + ".json"); 
     } 

Вот результат я получаю, когда моя форма заполнена:

{ 
    "Recipe Name": "Test", 
    "Ingredients Lists": "["{Ingredient=Ingredient0, Measure=ml, Quantity=0}","{Ingredient=Ingredient1, Measure=ml, Quantity=0}"]", 
    "Preparation": "This is a test.", 
    "Preparation Time": "["{Hours=0, Mins=0}"]", 
    "Cooking Time": "["{Hours=0, Mins=0}"]" 
    } 

Обратите внимание на "до того, как [в Список ингредиентов, приготовление Ti меня и время приготовления. Как я могу избавиться от них?

Заранее благодарен!

ответ

1

Ваш вопрос начинается с линии, как эти

obj.addProperty("Ingredients Lists", String.valueOf(ingredList)); 
obj.addProperty("Preparation Time", String.valueOf(prepTime)); 

Для HashMaps см How to convert hashmap to JSON object in Java (не принят один, но ответ Gson)

Аналогично для JSONArray, вы не» t необходимо до String.value им. Просто добавьте напрямую. Из API используйте метод add(String name, JsonElement element).

obj.add("Preparation Time", prepTime); 

Подробный ответ

Стоп строка замены. Ваши внутренние наборы данных просто не JSON, поэтому вы неправильно создаете этот JSON.

Обратите внимание на подсветку синтаксиса

Invalid

{ "Preparation Time": "["{Hours=0, Mins=0}"]" } 

Действительно - Внутренняя строка убежали.

{ "Preparation Time": "[\"{Hours=0, Mins=0}\"]" } 

Который по существу рассматривается как это любой JSON парсер

{ "Preparation Time": "..." } 

Вы можете getString("Preparation Time"), и он возвращает "[\"{Hours=0, Mins=0}\"]" как String. Если вы конвертируете это в JSONArray, то это массив строк. Распечатайте первый элемент, вы должны видеть только "{Hours=0, Mins=0}" (цитаты хранятся), поэтому вы должны заменить кавычки и {} символов, а не обратную косую черту. И вы можете разделить на равные знаки, чтобы получить ключевые значения, и т. Д. И т. Д. ... но это звучит как большая работа.


В принципе, в парах JSON с ключом значения нет.

{Ingredient=Ingredient0, Measure=ml, Quantity=0} 

Так, Gson делает для того чтобы обработать каждый из значений этих ключей в качестве String типа и любые цитаты или слэш будет неэкранированным, когда вы распечатать данные, но она хранится в памяти спаслись.

Однако вы хотите проанализировать дополнительные данные, не связанные с разбором JSON, так что это мой намек, и вы можете перестать царапать голову.


Для чего это стоит, здесь является JSON для этих данных. Итак, мое предложение - исправить класс модели и фрагменты кода, которые генерируют эти данные.

{ 
    "Recipe Name": "Test", 
    "Ingredients Lists": [{ 
     "Ingredient": "Ingredient0", 
     "Measure": "ml", 
     "Quantity": 0 
    }, { 
     "Ingredient": "Ingredient1", 
     "Measure": "ml", 
     "Quantity": 0 
    }], 
    "Preparation": "This is a test.", 
    "Preparation Time": [{ 
     "Hours": 0, 
     "Mins": 0 
    }], 
    "Cooking Time": [{ 
     "Hours": 0, 
     "Mins": 0 
    }] 
} 
+0

Использовать 'add (свойство String, значение JsonElement)' –

+0

Ah! Вы гений! Я был двойным/тройным преобразованием в json ... –

+0

Добро пожаловать :) Извините за длинный, слишком подробный ответ. Вы можете поблагодарить вас за [принятие ответа] (// stackoverflow.com/help/someone-answers). –

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