codepleb
codepleb

Reputation: 10571

Pretty output always inserts "\r\n"

I'm working on an expenses calculator. Before, I had a working XML output that didn't print the linebreaks. I think something got messed up, maybe that the editor doesn't see the linebreak as a linebreak, no idea.

But when I save my expenses, I get a very ugly output:

"[ {\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} ]"

If I look at the console (doing a print there), I get what I want:

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

Currently, my code is quite simple:

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

This is how the entity class looks:

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

I tried to get every single in the list and convert it to a json string -> concat it to a big single string which I printed out. Same result though.

Upvotes: 0

Views: 1412

Answers (1)

Peter Lawrey
Peter Lawrey

Reputation: 533660

What this line does

mapper.writeValue(outputFile, s);

Is take a String and write it as a value in a JSON message. If that String already contains special characters, they have to be escaped out.

What you wanted most likely is

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

Upvotes: 1

Related Questions