Невозможно десериализовать JSON, который я сериализовал?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Невозможно десериализовать JSON, который я сериализовал?

Сообщение Anonymous »

Я пытаюсь создать класс, который сериализует и десериализует класс Java в JSON. Я использую
Quarkus REST Jackson для преобразования между классом NetInfo и JSON и записи в файл
net.json.
Я могу сериализовать класс, но не могу его десериализовать.
Мой класс чтения/записи показан ниже:

Код: Выделить всё

public class WriterReaderFile
{
private static final ObjectMapper theMapper = new ObjectMapper()
.enable(SerializationFeature.WRAP_ROOT_VALUE)
.enable(SerializationFeature.INDENT_OUTPUT);

public boolean writeToFile(File theFile,NetInfoList theList)
{
boolean exists = theFile.exists();

if(exists)
{
try
{
theMapper.writeValue(theFile, theList);
}
catch (Exception e)
{
e.printStackTrace();
}
}

return(exists);
}

public NetInfoList readFromFile(File theFile)
{
NetInfoList theList = theMapper.convertValue(theFile, NetInfoList.class);
return(theList);
}

}
Обратите внимание, что я сохраняю класс под названием «NetInfoList». Этот класс находится ниже:

Код: Выделить всё

@JsonRootName("MyInfo")
public class NetInfoList extends ArrayList
{
public NetInfoList()
{
super();
}
}
Класс NetInfo, указанный в NetInfoList, приведен ниже:

Код: Выделить всё

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
// @JsonRootName("Info")
public class NetInfo
{
@JsonProperty("URI")
private String thePath;

@JsonProperty("Protocol")
@Builder.Default
private HttpProtocol selProtocol = HttpProtocol.Http;

@JsonProperty("Action")
@Builder.Default
private HttpAction theAction = HttpAction.Get;
}
Обратите внимание на использование Lombok в этом классе.
Когда я тестирую этот класс, я записываю 3 экземпляра NetInfo в Net.json. Я получаю следующий результат:

Код: Выделить всё

{
"MyInfo" : [ {
"URI" : "/first",
"Protocol" : "Http",
"Action" : "Get"
}, {
"URI" : "/second",
"Protocol" : "Http",
"Action" : "Get"
}, {
"URI" : "/third",
"Protocol" : "Http",
"Action" : "Get"
} ]
}
Нет проблем, хотя я хотел бы иметь корневое имя для каждого из моих объектов NetInfo. Мое добавление аннотации
@JsonRootName к классу NetInfo игнорируется анализатором (она закомментирована).
К сожалению, когда я пытаюсь прочитать файл Net.json и превратить его обратно в объект NetInfo, я получаю
следующую ошибку:

Код: Выделить всё

java.lang.IllegalArgumentException: Cannot deserialize value of type `net.factor3.app.net.NetInfoList` from String value (token `JsonToken.VALUE_STRING`)
at [Source: UNKNOWN; byte offset: #UNKNOWN]

at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4730)
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4661)
at net.factor3.app.defender.proxies.WriterReaderFile.readFromFile(WriterReaderFile.java:161)
at net.factor3.app.defender.BasicProxyTests.testreadFromFile(BasicProxyTests.java:140)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `net.factor3.app.net.NetInfoList` from String value (token `JsonToken.VALUE_STRING`)
at [Source: UNKNOWN; byte offset: #UNKNOWN]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:72)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1822)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1596)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1543)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:404)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromString(CollectionDeserializer.java:331)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:251)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:29)
Это не имеет смысла. Может кто-нибудь сказать мне, почему я не могу без проблем десериализовать класс, который изначально
сериализовался? Может ли это быть ошибка в библиотеках Quarkus Jackson? Что-то
мне следует сделать, чтобы сделать JSON десериализуемым?

Подробнее здесь: https://stackoverflow.com/questions/798 ... serialized
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»