有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

json参数化Jackson Java库的JsonProperty值

我想把这具尸体和杰克逊连载

但在许多API调用中,“requestName”部分将有所不同

所以这部分我有一些不同的对象

问题是我想参数化这个JsonProperty的名称,但是注释不接受这个变量

当我编译它时,我得到了这个错误:

/home/duma/IdeaProjects/API Testing/src/test/java/SingleRequest.java:16:19
java: element value must be a constant expression

你知道吗

正文:

"singleRequest": {
        "requestName": {
            "canReplaceSpellCheckerQuery": false,
            "language": "fa",
            "query": "test",
            "scope": "app",
            "entities": ""
        }
    }

代码:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SingleRequest {
   
    private Object object;
    @JsonIgnore
    private String requestName;

    SingleRequest(Object request, String requestName){
        this.object = request;
        this.requestName = requestName;
    }

    @JsonProperty(value = requestName)
    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }
    
    public String getRequestName() {
        return requestName;
    }
    public void setRequestName(String requestName) {
        this.requestName = requestName;
    }
}


共 (1) 个答案

  1. # 1 楼答案

    考虑到您希望生成的JSON文档:

    "singleRequest": {
            "requestName": {
                "canReplaceSpellCheckerQuery": false,
                "language": "fa",
                "query": "test",
                "scope": "app",
                "entities": ""
            }
        }
    

    如果希望参数化字段"requestName"对应的键,则可以尝试以下代码:

    public class RequestDocument implements Serializable {
        Map<String, RequestOptions> singleRequest;
    
        public RequestDocument(Map<String, RequestOptions> singleRequest) {
            this.singleRequest = singleRequest;
        }
    
        public RequestDocument(String requestName, RequestOptions options) {
            this.singleRequest = new HashMap<String, RequestOptions>() {{
                    put(requestName, options);
                }
            };
        }
    
        public static RequestDocument makeSample() {
            return new RequestDocument("requestName", RequestOptions.makeSample());
        }
    
        public String toJsonString() throws IOException {
            return new ObjectMapper()
                    .setVisibility(PropertyAccessor.FIELD, Visibility.ANY) // just because I have no setter/getter
                    .writerWithDefaultPrettyPrinter()
                    .writeValueAsString(this);
        }
    }
    

    其中RequestOptions是:

    public class RequestOptions implements Serializable {
        Boolean canReplaceSpellCheckerQuery;
        String language;
        String query;
        String scope;
        String entities;
    
        public RequestOptions(Boolean canReplaceSpellCheckerQuery, String lang, String query, String scope, String entities) {
            this.canReplaceSpellCheckerQuery = canReplaceSpellCheckerQuery;
            this.language = lang;
            this.query = query;
            this.scope = scope;
            this.entities = entities;
        }        
        
        public static RequestOptions makeSample() {
            return new RequestOptions(false, "fa", "test", "app", "");
        }
    }
    

    通过运行以下代码:

     public static void main(String[] args) throws IOException {
            RequestDocument example = RequestDocument.makeSample();
            logger.info(example.toJsonString());
        }
    

    输出结果正是这样:

    {
      "singleRequest" : {
        "requestName" : {
          "canReplaceSpellCheckerQuery" : false,
          "language" : "fa",
          "query" : "test",
          "scope" : "app",
          "entities" : ""
        }
      }
    }
    

    我相信这是实现目标的最简单方法,但也有其他选择。你可以从阅读这篇文章和相关文章开始:https://www.baeldung.com/jackson-map

    请注意,提供的代码只是一个示例,没有经过特别的润色