2016-09-04 3 views
0

Я работаю над калькулятором расходов. Раньше у меня был рабочий XML-выход, который не печатал строки. Я думаю, что что-то перепуталось, может быть, редактор не видит, как linebreak становится линейной ошибкой, не знаю.Довольно вывод всегда « r n»

Но когда я сохраняю свои расходы, я получаю очень некрасиво выход:

"[ {\r\n \"title\" : \"2\",\r\n \"category\" : \"[None]\",\r\n \"period\" : \"Year\",\r\n \"value\" : \"2\"\r\n}, {\r\n \"title\" : \"3\",\r\n \"category\" : \"[None]\",\r\n \"period\" : \"Year\",\r\n \"value\" : \"3\"\r\n} ]"

Если я смотрю на консоли (делает оттиск там), я получаю то, что я хочу:

[ { "title" : "2", "category" : "[None]", "period" : "Year", "value" : "2" }, { "title" : "3", "category" : "[None]", "period" : "Year", "value" : "3" } ]

в настоящее время мой код довольно прост:

ObservableList<Expense> expenseList = FXCollections.observableArrayList(); 
//The list gets edited by a TableView. 
final ObjectMapper mapper = new ObjectMapper(); 
final String s = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(expenseList); 
FileOutputStream fos = new FileOutputStream(path); 
OutputStreamWriter outputFile = new OutputStreamWriter(fos, Charset.forName("UTF8")); 

mapper.writeValue(outputFile, s); 

Это как класс сущности выглядит:

public class Expense { 
    private StringProperty title = new SimpleStringProperty(); 
    private StringProperty category = new SimpleStringProperty(); 
    private StringProperty period = new SimpleStringProperty(); 
    private StringProperty value = new SimpleStringProperty(); 

    public void setTitle(String title) { 
     this.title.set(title); 
    } 

    public void setCategory(String category) { 
     this.category.set(category); 
    } 

    public void setPeriod(String period) { 
     this.period.set(period); 
    } 

    public void setValue(String value) { 
     this.value.set(value); 
    } 

    public Expense() {} //Default constructor is needed for XML-handling 

    public Expense(String title, String value, String period, String category) { 
     this.title = new SimpleStringProperty(title); 
     this.value = new SimpleStringProperty(value); 
     this.period = new SimpleStringProperty(period); 
     this.category = new SimpleStringProperty(category); 
    } 

    public String getTitle() { 
     return this.title.get(); 
    } 

    public String getCategory() { 
     return this.category.get(); 
    } 

    public String getPeriod() { 
     return this.period.get(); 
    } 

    public String getValue() { 
     return this.value.get(); 
    } 

    public StringProperty titleProperty() { 
     return this.title; 
    } 

    public StringProperty categoryProperty() { 
     return this.category; 
    } 

    public StringProperty periodProperty() { 
     return this.period; 
    } 

    public StringProperty valueProperty() { 
     return this.value; 
    } 
} 

Я пытался получить каждый в списке и преобразовать его в строку JSON -> CONCAT этом большой одну строку, которую я распечатаны. Тем не менее, тот же результат.

+0

Похоже, вы встраивание JSON строк внутри другой строки, скорее всего, в коде, не показаны. –

+1

@PeterLawrey Я добавил информацию о выходных потоках, если это поможет. – codepleb

ответ

1

Что эта линия делает

mapper.writeValue(outputFile, s); 

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

То, что вы хотели, скорее всего

try (FileOutputStream fos = new FileOutputStream(path); 
     OutputStreamWriter outputFile = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) { 
    outputFile .write(s); // just write the String as it is 
} 
+1

Ах, LOL. Теперь это означает, что вы упомянули об этом. Спасибо. PS: Я предполагаю, что вы хотели написать 'outputFile.write (s)', но это всего лишь деталь. Большое спасибо Питер! – codepleb

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