JSON-формат типа Protobuf использует строковый литерал "ключ" и "значение", а не фактические значения
Я пытаюсь преобразовать объект protobuf в формат JSON, используя com.googlecode.protobuf.format.JsonFormat
но map
Тип вышел неожиданным.
Мое сообщение так
message Response {
repeated Candidate candidates = 1;
map<string, ErrorMessage> errors = 2;
}
message ErrorMessage {
string message = 0;
ErrorType type = 1;
}
enum ErrorType {
ERROR = 0;
WARNING = 1;
}
Вопрос заключается в формате JSON Response
объект, который я создал
Response response = ...
Return new ResponseEntity<>(new JsonFormat().printToString(response), HttpStatus.OK);
Я ожидаю, что ошибки будут отформатированы как карта, введенная строковым значением (ключа карты)
...
"errors": {
"someID" : {
"message": "blah blah",
"type": "ERROR"
}
}
Однако фактический результат (я оценил только new JsonFormat().printToString(response)
участие в интелий)
...
"errors": {
"key": "someID",
"value": {
"message": "blah blah",
"type": "ERROR"
}
}
Я надеюсь, что это небольшая конфигурация, которую я пропустил, чтобы сделать protobuf (или Джексона?), Чтобы знать реальное значение ключа? не используя "ключ" и "значение".
Кстати, какой смысл иметь буквальное поле "ключ" и "значение" в map
тип? Вы не можете сделать составной поиск с ним, и вы можете просто использовать пользовательский тип / объект.
1 ответ
Этот код прекрасно работает для меня:
test.proto
syntax = "proto2";
package by.dev.madhead;
option java_outer_classname = "SO";
message Candidate {
}
enum ErrorType {
ERROR = 0;
WARNING = 1;
}
message ErrorMessage {
required string message = 1;
required ErrorType type = 2;
}
message Response {
repeated Candidate candidates = 1;
map<string, ErrorMessage> errors = 2;
}
App.java
public class App {
public static void main(String[] args) throws InvalidProtocolBufferException {
SO.Response response = SO.Response.newBuilder()
.addCandidates(SO.Candidate.newBuilder().build())
.addCandidates(SO.Candidate.newBuilder().build())
.addCandidates(SO.Candidate.newBuilder().build())
.putErrors("error1", SO.ErrorMessage.newBuilder().setMessage("error1").setType(SO.ErrorType.ERROR).build())
.putErrors("error2", SO.ErrorMessage.newBuilder().setMessage("error2").setType(SO.ErrorType.WARNING).build())
.build();
System.out.println(JsonFormat.printer().print(response));
}
}
Выход:
{
"candidates": [{
}, {
}, {
}],
"errors": {
"error1": {
"message": "error1",
"type": "ERROR"
},
"error2": {
"message": "error2",
"type": "WARNING"
}
}
}
Который не имеет key
с и value
как вы видите. Убедитесь, что вы напечатали не само сообщение, а результат JsonFormat.printer().print()
, В принципе, key
а также value
вы видели из внутреннего toString()
реализация Protobuf Message
,
И полное название класса для JsonFormat
является com.google.protobuf.util.JsonFormat
не com.googlecode.protobuf.format.JsonFormat
,