在Rest响应中,我的swagger文件中标记为“ discriminator”的字段已重复。我有一个父对象,该对象具有一个称为“ subjectType”的字段,我已将其标记为鉴别符。在我的休息电话中,我只返回了资源对象(基于请求中的subjectType的 SubjectA 对象或 SubjectB 对象),该对象具有以下swagger文件中提到的所有参数:
Subject:
type: object
discriminator: subjectType
properties:
id:
type: string
minLength: 32
maxLength: 32
description:
type: string
maxLength: 350
subjectType:
type: string
enum:
- SubjectA
- SubjectB
required:
- subjectType
- description
SubjectA:
allOf:
- $ref: "#/definitions/Subject"
- type: object
properties:
name:
type: string
maxLength: 100
complexity:
type: string
maxLength: 256
required:
- name
- complexity
SubjectB:
allOf:
- $ref: "#/definitions/Subject"
- type: object
properties:
prof:
type: string
maxLength: 100
ref:
type: string
maxLength: 256
required:
- prof
- ref
因此,当我返回 SubjectA 或 SubjectB 类型的响应对象时,我发回的响应对象只有一个“ subjectType”字段,但实际是json返回给客户端的响应具有两个“ subjectType”字段,我认为这是大张旗鼓的。 Swagger版本:2.4.1
以下是回复:
{ “ subjectType”:“ SubjectA” , “ id”:“ 123”, “ subjectType”:“ SubjectA” , “ name”:“ abc”, “ complexity”:“ L1” }
@Path("/subjects")
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@ResponseStatus(status = Response.Status.CREATED)
public Response createSubject(Subject subject) {
//Removed my DAO calls and other logic.
final Subject subject =
createSubject(profile); //Modifying the subject object in this method as per my needs.
return Response.status(Response.Status.CREATED).entity(subject).build();
}
这是由摇摇欲坠的代码生成的对象:
@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2019-04-01T17:05:27.110-07:00")@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "subjectType", visible = true )
@JsonSubTypes({
@JsonSubTypes.Type(value = SubjectA.class, name = "SubjectA"),
@JsonSubTypes.Type(value = SubjectB.class, name = "SubjectB"),
})
public class Subject {
@JsonProperty("id")
private String id;
@JsonProperty("description")
private String description;
@JsonProperty("subjectType")
private String subjectType;
//Getters and Setters
}
@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2019-04-01T17:05:27.110-07:00")
public class SubjectA extends Subject {
@JsonProperty("name")
private String name;
@JsonProperty("complexity")
private String complexity;
//Getter and Setters
}
如何在回送给客户端的Json响应中阻止两次填充subjectType字段?
答案 0 :(得分:-1)
除了所涉及的开销之外,我还不确定您在担心什么,在响应JSON中有重复的密钥。
JSON RFC说到JSON对象:
对象中的名称应唯一。
其中的应该正式defined为
此字词或形容词“推荐”的意思是 在特定情况下可能存在正当理由而忽略 特定项目,但必须理解全部含义并 在选择其他路线之前,请仔细权衡。
现在可能没有理由说明发生了这种重复,但这不是被禁止的,因此所有确认JSON工具都必须能够处理它。我本来希望JSON规范会说出在有非唯一键(例如第一个或最后一个值)的情况下应该选择什么值,但是由于这些键的值相同,所以实际上并不重要。 / p>
这仍然留下了问题,这是如何发生的。在许多语言中,JSON对象的内部表示形式(例如Python中的$request->hasFile('shop1_quatation')
)是基于哈希的映射,甚至不能具有重复的键。我假设此JSON是通过某种方式即时生成的,而没有完整的内部表示形式,这会过滤掉重复项。