Джексон не преобразует объект в строку Json

#java #json #jackson

Вопрос:

Я пытаюсь преобразовать объект гостевой книги в строку Json, но Objectmapper не принимает мой объект. mapper.writeValueAsString(GuestbookEntry) выдает ошибку.

 
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GuestbookEntry extends Entry{
    private String author;
    private String content;

 public GuestbookEntry(String author, String content) throws IllegalArgumentException  {
        super();
       if(author == null || content == null){
            throw new IllegalArgumentException ("wrong entry");
        }
        Matcher hasMatch = special.matcher(author);
        Matcher hasMatch2 = special2.matcher(content);

        // Überprüfe Sonderzeichen
        if (hasMatch.find() || hasMatch2.find()){
            throw new IllegalArgumentException("wrong entry");
        }
        this.author = author;
        this.content = content;
    }




    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        if(author == null ){
            throw new NullPointerException("no name");
        }
        Matcher hasMatch = special.matcher(author);

        if (hasMatch.find()){
            throw new IllegalArgumentException("wrong entry");
        }
            this.author = author;

    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        if(content == null){
            throw new NullPointerException("no entry");

        }
        Matcher hasMatch2 = special2.matcher(content);


        if (hasMatch2.find()){
            throw new IllegalArgumentException("wrong entry");
        }
        this.content = content;


    }




    @Override
    public String toJson() {
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode rootNode = mapper.createObjectNode();
        try {
            String JsonString = mapper.writeValueAsString(GuestbookEntry);
          return JsonString;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
 

mapper.writeValueAsString, похоже, требует выражения, но я и раньше видел, как люди преобразуют объекты в строки Json.
ve already tried different inputs, but I Я понятия не имею, что делать.

Он говорит мне: «не удается разрешить символ гостевой книги».

Мой вклад в это:

 GuestbookEntry test = new GuestbookEntry("testname", "test entry");
System.out.println(test.toJson());
 

И я хочу получить что-то вроде:

 {id:12345624553, date:"2021-07-02T21:12:50.437600", author:"testname", content:"test entry"};
 

Комментарии:

1. пожалуйста, добавьте сообщение об ошибке и некоторые входные данные к вашему вопросу, thx

Ответ №1:

У вас ошибка компилятора, потому что вы передаете имя ссылки на класс GuestbookEntry в средство отображения вместо экземпляра в toJSON методе. Чтобы это сработало, передайте this ключевое слово:

 mapper.writeValueAsString(this);
 

В нем будет содержаться экземпляр класса, который картограф будет сериализовать.

Кроме того, если вы хотите десериализовать его позже, вам придется предоставить конструктор по умолчанию для этого класса или поместить аннотации Джексона JsonProperty в существующий конструктор.

Чтобы узнать больше об аннотациях Джексона: https://www.baeldung.com/jackson-annotations

Комментарии:

1. Я добавил строку mapper.writeValueAsString(это), но теперь я ve got a bunch of Errors like com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time. LocalDateTime` не поддерживается по умолчанию: добавьте модуль «com.fasterxml.jackson.тип данных:jackson-тип данных-jsr310», чтобы включить обработку

2. Итак LocalDateTime , в вашем классе есть поля java 8. Вы должны рассказать Джексону, как их правильно сериализовать, два варианта: 1. Добавьте зависимость, о которой упоминается в сообщении об ошибке, и этого будет достаточно. 2. Напишите пользовательский сериализатор для этого поля. Чтобы узнать, как это сделать: baeldung.com/jackson-serialize-dates

Ответ №2:

Попробуйте это, как уже упоминалось, это ошибка компилятора

 package test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GuestbookEntry extends Entry {
private String author;
private String content;

public GuestbookEntry(String author, String content) throws IllegalArgumentException {
    super();
    if (author == null || content == null) {
        throw new IllegalArgumentException("wrong entry");
    }
    Matcher hasMatch = special.matcher(author);
    Matcher hasMatch2 = special2.matcher(content);

    // Überprüfe Sonderzeichen
    if (hasMatch.find() || hasMatch2.find()) {
        throw new IllegalArgumentException("wrong entry");
    }
    this.author = author;
    this.content = content;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    if (author == null) {
        throw new NullPointerException("no name");
    }
    Matcher hasMatch = special.matcher(author);

    if (hasMatch.find()) {
        throw new IllegalArgumentException("wrong entry");
    }
    this.author = author;

}

public String getContent() {
    return content;
}

public void setContent(String content) {
    if (content == null) {
        throw new NullPointerException("no entry");

    }
    Matcher hasMatch2 = special2.matcher(content);

    if (hasMatch2.find()) {
        throw new IllegalArgumentException("wrong entry");
    }
    this.content = content;

}

@Override
public String toJson() {
    ObjectMapper mapper = new ObjectMapper();
    ObjectNode rootNode = mapper.createObjectNode();
    try {
        String JsonString = mapper.writeValueAsString(this);
        return JsonString;
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return null;
}

public static void main(String a[]) {
    GuestbookEntry test = new GuestbookEntry("testname", "test entry");
    System.out.println(test.toJson());
}
 

}