映射<字符串、对象的 JSON 表示形式>



我已经获得了一个API端点,我正在尝试使用Postman对其进行测试。API具有映射<字符串,对象>我不知道如何用JSON格式表示,以便Postman能够使用。

这是实体:

import java.util.Map;
import com.abcd.xyz.option.Option;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter @Setter @NoArgsConstructor @ToString
public class Project {
private String name;
private String shortName;
private String idName;
private String language;
private String buildTool;
private String k8sid;
private String dnsId;
private String jenkinsUrl;
private Map<String, Option> options;
}

选项定义:

import java.util.List;
import com.abcd.xyz.bundling.ResourceFile;
import com.abcd.xyz.project.Project;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;
@JsonTypeInfo(use=JsonTypeInfo.Id.CUSTOM, include=JsonTypeInfo.As.PROPERTY, property="option")
@JsonTypeIdResolver(OptionTypeIdResolver.class)
public interface Option {
@JsonIgnore
public List<ResourceFile> getFiles(Project project);
}

OptionTypeIdResolver:

import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.databind.DatabindContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
import com.fasterxml.jackson.databind.type.TypeFactory;
// Handles the conversion of the "option" property of an Option class into JSON, or from
// JSON into the correct Option type.
public class OptionTypeIdResolver implements TypeIdResolver {
private static final String OPTION_PACKAGE = Option.class.getPackage().getName();
private JavaType baseType;
@Override
public void init(JavaType baseType) {
this.baseType = baseType;
}
@Override
public Id getMechanism() {
return Id.CUSTOM;
}
@Override
public String idFromValue(Object obj) {
return idFromValueAndType(obj, obj.getClass());
}
@Override
public String idFromBaseType() {
return idFromValueAndType(null, baseType.getRawClass());
}
@Override
public String idFromValueAndType(Object obj, Class<?> clazz) {
// Convert java class name to simple name, ie package.GradleOption -> gradle
String simpleName = clazz.getSimpleName().substring(0, 1).toLowerCase() + clazz.getSimpleName().substring(1).replaceAll("Option$","");
if ( clazz.getName().startsWith(OPTION_PACKAGE) ) {
return simpleName;
}
throw new IllegalStateException("class " + clazz + " is not in the package " + OPTION_PACKAGE);
}
@Override
public JavaType typeFromId(DatabindContext context, String type) {
Class<?> clazz;
// Convert simple name to java class name, ie gradle -> package.GradleOption
String javaType = type.substring(0, 1).toUpperCase() + type.substring(1) + "Option";
String clazzName = OPTION_PACKAGE + "." + javaType;
try {
clazz = TypeFactory.defaultInstance().findClass(clazzName);
} catch (ClassNotFoundException e) {
throw new IllegalStateException("cannot find class '" + clazzName + "'");
}
return TypeFactory.defaultInstance().constructSpecializedType(baseType, clazz);
}
@Override
public String getDescForKnownTypeIds() {
return "";
}
}

这是我正在使用的POST主体:

{
"buildTool": "gradle",
"dnsId": "demo005",
"idName": "demo005",
"jenkinsUrl": "",
"k8sid": "er5t-eks-oGWFNxUs",
"language": "java",
"name": "demo005",
"shortName": "f",
"titleName": "demo004",
"options": [
{"java": {
"JavaOption": {
"group": "com.example",
"name": "f"
}
}
}
]
}

我得到的错误是:

o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Missing type id when trying to resolve subtype of [simple type, class com.abcd.xyz.option.Option]: missing type id property 'option'; nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.abcd.xyz.option.Option]: missing type id property 'option'
at [Source: (PushbackInputStream); line: 10, column: 16] (through reference chain: com.abcd.xyz.project.Project["titleName"])]

我的格式有什么错。。?

映射<字符串,选项>

String = key
Option = Object
would be in this json format
{
"String":{
//option object definition here
}
}

您的"选项">字段在这种情况下采用List<映射<字符串,选项>gt但不是映射<字符串,选项>[项目实体表]中定义

最新更新