如何定义JSON模式中的属性顺序?

Nih*_* G. 3 json jsonschema

我有以下java对象:

ProcessBean.java

import java.util.List;
import com.fasterxml.jackson.annotation.JsonRootName;

@JsonRootName(value = "process")
public class ProcessBean{
    private Integer id;
    private String name;
    private String description;
    private String user;
    private String executePermissions;
    private String createdDtm;
    private String updatedDtm;
    private Process tpProcess;
    private List<ProcessParamBean> processParameters;

    /* --------Getters and Setters ----------*/
}
Run Code Online (Sandbox Code Playgroud)

我需要找到该对象的JSON模式,该模式用于在UI上显示这些字段。UI中字段的顺序取决于所生成的JSON模式中属性的顺序。

我使用以下代码生成了架构:

数据规范

import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;

public class DataSpec {
    public static <T> String getDataSpec(Class<T> clazz) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
        SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
        MetauiVisitorContext obj = new MetauiVisitorContext();
        visitor.setVisitorContext(obj);
        try {
            mapper.acceptJsonFormatVisitor(clazz, visitor);
            JsonSchema schema = visitor.finalSchema();
            return mapper.writeValueAsString(schema);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MetauiVisitorContext.java

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.module.jsonSchema.factories.VisitorContext;

public class MetauiVisitorContext extends VisitorContext{
    @Override
    public String getSeenSchemaUri(JavaType aSeenSchema) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果模式如下所示:

{
  "type": "object",
  "id": "urn:jsonschema:com:restservices:api:jsonbeans:ProcessBean",
  "properties": {
    "updatedDtm": {
      "type": "string"
    },
    "createdDtm": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "tpProcess": {
      "type": "object",
      "id": "urn:jsonschema:com:restservices:api:jsonbeans:Process",
      "properties": {
        "name": {
          "type": "string"
        },
        "id": {
          "type": "integer"
        }
      }
    },
    "description": {
      "type": "string"
    },
    "id": {
      "type": "integer"
    },
    "processParameters": {
      "type": "array",
      "items": {
        "type": "object",
        "id": "urn:jsonschema:com:restservices:api:jsonbeans:ProcessParamBean",
        "properties": {
          "updatedDtm": {
            "type": "string"
          },
          "defaultValue": {
            "type": "string"
          },
          "createdDtm": {
            "type": "string"
          },
          "masterParam": {
            "type": "object",
            "id": "urn:jsonschema:com:restservices:api:jsonbeans:MasterParamBean",
            "properties": {
              "updatedDtm": {
                "type": "string"
              },
              "createdDtm": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "id": {
                "type": "integer"
              }
            }
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "processParamId": {
            "type": "integer"
          },
          "id": {
             "type": "integer"
          },
          "userPrompted": {
             "type": "boolean"
          },
          "tags": {
            "type": "string"
          }
        }
      }
    },
    "executePermissions": {
      "type": "string"
    },
    "user": {
      "type": "string"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

可以看出,JSON模式中属性的顺序与Java对象中定义的字段的顺序不匹配,这对我来说是必需的。

那么如何确定属性的顺序呢?

jru*_*ren 5

JSON模式对象中没有属性的固有顺序,就像常规JSON或javascript对象一样。实际上,它不会更改验证语义。以下架构验证了完全相同的对象集合:

模式1:

{
    "properties" : {
        "prop1" : {
            "type" : "string"
        },
        "prop2" : {
            "type" : "number"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

模式2:

{
    "properties" : {
        "prop2" : {
            "type" : "number"
        },
        "prop1" : {
            "type" : "string"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要保留一些顺序,则需要在and数组内进行。您可以通过使用对象数组而不是items子句中的对象来实现。一个例子:

{
    "type" : "array" :
    "items" : [{
            "properties" : {
                "prop2" : {
                    "type" : "number"
                }
            }
        }, {
            "properties" : {
                "prop1" : {
                    "type" : "string"
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以获得UI项的有序定义。不幸的是,它迫使您将每个属性嵌套在一个对象中。