问题
We are working in an backend application in which we use Protobuffers as model/pojo files. We have to call an API which returns a response as a JSON.
message Example{
string id = 1;
string another_id = 2;
int32 code = 3;
string name = 4;
Timestamp date =5;
}
Now we need to call an API which returns response in JSON:
{
"json_id":"3",
"json_another_id":"43",
"code":34,
"json_name":"Yeyproto",
"json_date":"2018-01-01T10:00:20.021-05:00"
}
I am mapping the response(which is in json) directly with Proto using jackson mixin
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.google.protobuf.Descriptors;
import com.google.protobuf.Timestamp;
import java.time.Instant;
import java.util.Map;
public class ProtobufApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = JsonMapper.builder()
.enable(SerializationFeature.INDENT_OUTPUT)
.addMixIn(Example.class, ExampleMixin.class)
.build();
String json = "{" +
"\"json_id\":\"3\"," +
"\"json_another_id\":\"43\"," +
"\"code\":34," +
"\"json_name\":\"Yeyproto\"," +
"\"json_date\":\"2018-01-01T10:00:20.021-05:00\"+
"}";
Example deserialised = mapper.readValue(json, Example.class);
System.out.println(deserialised);
}
}
abstract class ExampleMixin extends ProtoBufIgnoredMethods {
@JsonProperty("json_id")
String id_;
@JsonProperty("json_another_id")
String anotherId_;
@JsonProperty("code")
int code_;
@JsonProperty("json_name")
String name_;
@JsonProperty("currTime")
Timestamp currTime_;
}
abstract class ProtoBufIgnoredMethods {
@JsonIgnore
public abstract Map<Descriptors.FieldDescriptor, Object> getAllFields();
}
But it's not working with Timestamp and below is the error received. Please let me know any solution
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.protobuf.Descriptors$FieldDescriptor]
来源:https://stackoverflow.com/questions/59287181/how-to-enable-google-protobuf-timestamp-mapping-from-json-to-proto-in-jackson-mi