Java 如何在Jackson mixin中启用从json到proto的google.protobuf.Timestamp映射
我们在一个后端应用程序中使用Protobuffers作为model/pojo文件。我们必须调用以JSON形式返回响应的APIJava 如何在Jackson mixin中启用从json到proto的google.protobuf.Timestamp映射,java,json,jackson,jackson-databind,proto,Java,Json,Jackson,Jackson Databind,Proto,我们在一个后端应用程序中使用Protobuffers作为model/pojo文件。我们必须调用以JSON形式返回响应的API message Example{ string id = 1; string another_id = 2; int32 code = 3; string name = 4; Timestamp date =5
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"
}
我使用jacksonmixin将响应(json格式)直接映射到Proto
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();
}
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.protobuf.Descriptors$FieldDescriptor]