【问题标题】:How to modify values inside JSON object in Java如何在 Java 中修改 JSON 对象内的值
【发布时间】:2022-04-17 17:20:06
【问题描述】:

我有一个像这样的 JSON 对象。

{
   "result":{
      "issue_date":"20-02-2011",
      "father/husband":"Chopra",
      "name":"Variyar",
      
 "img":"/9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS",
      "blood_group":"",
      "dob":"11-03-1981",
      "validity":{
         "non-transport":"24-03-2010 to 23-02-2030",
         "transport":""
      },
      "cov_details":[
         {
            "issue_date":"UNIT OFFICE,TRICHY",
            "cov":"NCWG"
         }
      ],
      "dl_number":"TN0290000784",
      "address":"PERIYA COLONY  KO PAVAZHANGUDI  VIRUDHACHALAM TK"
   },
   "request_id":"a2642ae9-2f10-4e9a-9f7e-c3ee1a9a2dbe",
   "status-code":"101"
}

我想使用 java 编辑“结果”中的“img”中的值。

obj.remove("img");
obj.put("img","N/A");

但它不起作用。我的预期输出是 Img 标签应该是这样的

 "img":"N/A",     

关于如何实现这一点的任何建议?

【问题讨论】:

  • 除了答案中的所有好的建议之外,您可以使用正则表达式的字符串替换,这不需要任何额外的包。虽然我不能给你确切的正则表达式来适合你的情况。
  • 我同意@TomElias。有时,像 ObjectMapper 这样只更新 JSON 中的一个字符串值的工具是多余的。除了简单标准的字符串操作,大家可以看看这个stackoverflow.com/questions/64422516/…
  • 对所有非常喜欢 JSON 解析器的人提出警告:1) JSON 映射严重依赖反射。这在高吞吐量系统中是非常糟糕的性能。 2) JSON 序列化器通常不是线程安全的。人们通常将对象映射器用作单例 bean,这可能是有风险的。

标签: java json


【解决方案1】:

试试这样的。以下是删除或更新数据的两个选项。使用 com.fasterxml.jackson

  String tt = "{   \"result\":{      \"issue_date\":\"20-02-2011\",      \"father/husband\":\"Chopra\",      \"name\":\"Variyar\",       \"img\":\"/9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS\",      \"blood_group\":\"\",      \"dob\":\"11-03-1981\",      \"validity\":{         \"non-transport\":\"24-03-2010 to 23-02-2030\",         \"transport\":\"\"      },      \"cov_details\":[         {            \"issue_date\":\"UNIT OFFICE,TRICHY\",            \"cov\":\"NCWG\"         }      ],      \"dl_number\":\"TN0290000784\",      \"address\":\"PERIYA COLONY  KO PAVAZHANGUDI  VIRUDHACHALAM TK\"   },   \"request_id\":\"a2642ae9-2f10-4e9a-9f7e-c3ee1a9a2dbe\",   \"status-code\":\"101\"}";
         ObjectMapper mapper = new ObjectMapper();
         mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
         JsonFactory factory = mapper.getFactory();
         JsonParser createParser = factory.createParser(tt);
         JsonNode actualObj1 = mapper.readTree(createParser);
// if you just want to update
         ((ObjectNode)((ObjectNode)actualObj1).get("result")).put("img", "n/a"); 
// if you just want delete
         ((ObjectNode)((ObjectNode)actualObj1).get("result")).remove("img");
         System.out.println(actualObj1.toString());

【讨论】:

    【解决方案2】:

    您可以使用任何流行的 Json 序列化库将 Java 对象转换为 Json,反之亦然:

    在 Jackson 的例子中,Java 中的对象看起来像这样:

    package com.example;
    
    import java.util.HashMap;
    import java.util.Map;
    import com.fasterxml.jackson.annotation.JsonAnyGetter;
    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "issue_date",
    "cov"
    })
    public class CovDetail {
    
    @JsonProperty("issue_date")
    private String issueDate;
    @JsonProperty("cov")
    private String cov;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    
    @JsonProperty("issue_date")
    public String getIssueDate() {
    return issueDate;
    }
    
    @JsonProperty("issue_date")
    public void setIssueDate(String issueDate) {
    this.issueDate = issueDate;
    }
    
    @JsonProperty("cov")
    public String getCov() {
    return cov;
    }
    
    @JsonProperty("cov")
    public void setCov(String cov) {
    this.cov = cov;
    }
    
    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
    }
    
    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
    }
    
    }
    
    package com.example;
    
    import java.util.HashMap;
    import java.util.Map;
    import com.fasterxml.jackson.annotation.JsonAnyGetter;
    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "result",
    "request_id",
    "status-code"
    })
    public class Result {
    
    @JsonProperty("result")
    private Result_ result;
    @JsonProperty("request_id")
    private String requestId;
    @JsonProperty("status-code")
    private String statusCode;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    
    @JsonProperty("result")
    public Result_ getResult() {
    return result;
    }
    
    @JsonProperty("result")
    public void setResult(Result_ result) {
    this.result = result;
    }
    
    @JsonProperty("request_id")
    public String getRequestId() {
    return requestId;
    }
    
    @JsonProperty("request_id")
    public void setRequestId(String requestId) {
    this.requestId = requestId;
    }
    
    @JsonProperty("status-code")
    public String getStatusCode() {
    return statusCode;
    }
    
    @JsonProperty("status-code")
    public void setStatusCode(String statusCode) {
    this.statusCode = statusCode;
    }
    
    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
    }
    
    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
    }
    
    }
    
    package com.example;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import com.fasterxml.jackson.annotation.JsonAnyGetter;
    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "issue_date",
    "father/husband",
    "name",
    "img",
    "blood_group",
    "dob",
    "validity",
    "cov_details",
    "dl_number",
    "address"
    })
    public class Result_ {
    
    @JsonProperty("issue_date")
    private String issueDate;
    @JsonProperty("father/husband")
    private String fatherHusband;
    @JsonProperty("name")
    private String name;
    @JsonProperty("img")
    private String img;
    @JsonProperty("blood_group")
    private String bloodGroup;
    @JsonProperty("dob")
    private String dob;
    @JsonProperty("validity")
    private Validity validity;
    @JsonProperty("cov_details")
    private List<CovDetail> covDetails = null;
    @JsonProperty("dl_number")
    private String dlNumber;
    @JsonProperty("address")
    private String address;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    
    @JsonProperty("issue_date")
    public String getIssueDate() {
    return issueDate;
    }
    
    @JsonProperty("issue_date")
    public void setIssueDate(String issueDate) {
    this.issueDate = issueDate;
    }
    
    @JsonProperty("father/husband")
    public String getFatherHusband() {
    return fatherHusband;
    }
    
    @JsonProperty("father/husband")
    public void setFatherHusband(String fatherHusband) {
    this.fatherHusband = fatherHusband;
    }
    
    @JsonProperty("name")
    public String getName() {
    return name;
    }
    
    @JsonProperty("name")
    public void setName(String name) {
    this.name = name;
    }
    
    @JsonProperty("img")
    public String getImg() {
    return img;
    }
    
    @JsonProperty("img")
    public void setImg(String img) {
    this.img = img;
    }
    
    @JsonProperty("blood_group")
    public String getBloodGroup() {
    return bloodGroup;
    }
    
    @JsonProperty("blood_group")
    public void setBloodGroup(String bloodGroup) {
    this.bloodGroup = bloodGroup;
    }
    
    @JsonProperty("dob")
    public String getDob() {
    return dob;
    }
    
    @JsonProperty("dob")
    public void setDob(String dob) {
    this.dob = dob;
    }
    
    @JsonProperty("validity")
    public Validity getValidity() {
    return validity;
    }
    
    @JsonProperty("validity")
    public void setValidity(Validity validity) {
    this.validity = validity;
    }
    
    @JsonProperty("cov_details")
    public List<CovDetail> getCovDetails() {
    return covDetails;
    }
    
    @JsonProperty("cov_details")
    public void setCovDetails(List<CovDetail> covDetails) {
    this.covDetails = covDetails;
    }
    
    @JsonProperty("dl_number")
    public String getDlNumber() {
    return dlNumber;
    }
    
    @JsonProperty("dl_number")
    public void setDlNumber(String dlNumber) {
    this.dlNumber = dlNumber;
    }
    
    @JsonProperty("address")
    public String getAddress() {
    return address;
    }
    
    @JsonProperty("address")
    public void setAddress(String address) {
    this.address = address;
    }
    
    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
    }
    
    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
    }
    
    }
    
    package com.example;
    
    import java.util.HashMap;
    import java.util.Map;
    import com.fasterxml.jackson.annotation.JsonAnyGetter;
    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "non-transport",
    "transport"
    })
    public class Validity {
    
    @JsonProperty("non-transport")
    private String nonTransport;
    @JsonProperty("transport")
    private String transport;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    
    @JsonProperty("non-transport")
    public String getNonTransport() {
    return nonTransport;
    }
    
    @JsonProperty("non-transport")
    public void setNonTransport(String nonTransport) {
    this.nonTransport = nonTransport;
    }
    
    @JsonProperty("transport")
    public String getTransport() {
    return transport;
    }
    
    @JsonProperty("transport")
    public void setTransport(String transport) {
    this.transport = transport;
    }
    
    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
    }
    
    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
    }
    
    }
    

    然后您可以通过运行以下代码将 Json 序列化为 Java 对象:

    final ObjectMapper objectMapper = new ObjectMapper();
    final Result result = objectMapper.readValue(json, Result.class);
    

    json 变量指的是您的 Json 数据。拥有 Java 对象后,您可以简单地使用 getter 和 setter 来根据需要调整对象。

    result.setRequestId("Test");
    

    如果您想编辑 img 属性:

    result.getResult().setImg("N/A");
    

    如果您想将 Java 对象转换回 Json,您可以执行以下操作:

    final ObjectMapper mapper = new ObjectMapper();
    final String jsonString = mapper.writeValueAsString(result);
    

    Java 类的来源:http://www.jsonschema2pojo.org/

    【讨论】:

      【解决方案3】:

      使用简单 org.json 库的解决方案(*不使用 POJO 类)

      import org.json.JSONObject;
      
      public class Test {
      
          public static void main(String[] args) {
              String jsonArray = "{\n" +
                      "   \"result\":{\n" +
                      "      \"issue_date\":\"20-02-2011\",\n" +
                      "      \"father/husband\":\"Chopra\",\n" +
                      "      \"name\":\"Variyar\",\n" +
                      "      \n" +
                      " \"img\":\"/9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS\",\n" +
                      "      \"blood_group\":\"\",\n" +
                      "      \"dob\":\"11-03-1981\",\n" +
                      "      \"validity\":{\n" +
                      "         \"non-transport\":\"24-03-2010 to 23-02-2030\",\n" +
                      "         \"transport\":\"\"\n" +
                      "      },\n" +
                      "      \"cov_details\":[\n" +
                      "         {\n" +
                      "            \"issue_date\":\"UNIT OFFICE,TRICHY\",\n" +
                      "            \"cov\":\"NCWG\"\n" +
                      "         }\n" +
                      "      ],\n" +
                      "      \"dl_number\":\"TN0290000784\",\n" +
                      "      \"address\":\"PERIYA COLONY  KO PAVAZHANGUDI  VIRUDHACHALAM TK\"\n" +
                      "   },\n" +
                      "   \"request_id\":\"a2642ae9-2f10-4e9a-9f7e-c3ee1a9a2dbe\",\n" +
                      "   \"status-code\":\"101\"\n" +
                      "}";
              JSONObject jObject = new JSONObject(jsonArray);
              jObject.getJSONObject("result").put("img", "N/A");
              System.out.println(jObject);
          }
      
      }
      

      输出:

       {
         "result":{
            "cov_details":[
               {
                  "issue_date":"UNIT OFFICE,TRICHY",
                  "cov":"NCWG"
               }
            ],
            "img":"N/A",
            "dl_number":"TN0290000784",
            "address":"PERIYA COLONY  KO PAVAZHANGUDI  VIRUDHACHALAM TK",
            "issue_date":"20-02-2011",
            "dob":"11-03-1981",
            "name":"Variyar",
            "blood_group":"",
            "validity":{
               "transport":"",
               "non-transport":"24-03-2010 to 23-02-2030"
            },
            "father/husband":"Chopra"
         },
         "status-code":"101",
         "request_id":"a2642ae9-2f10-4e9a-9f7e-c3ee1a9a2dbe"
      }
      

      【讨论】:

      【解决方案4】:

      我建议使用字符串替换“img”对象如下(不管你有什么“img”值或长度):

      1. 首先获取“img”对象值作为字符串:

        String imgObject = "\"img\": \"" + json.getJSONObject("result").getString("img") + "\",";
        

      输出将是:

      "img": "/9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS",

      1. 然后只提取“img”值:

        imgObject = imgObject.substring(8,imgObject.length()-2);
        imgObject = imgObject.replace("\",","");
        

      输出将是:

      /9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS

      1. 将原来的Json转成字符串:

        String convertedJson = json.toString();
        
      2. 将“img”替换为“N/A”:

        convertedJson = convertedJson.replace(imgObject,"N/A");
        
      3. 转换回 JSONObject:

        json = new JSONObject(convertedJson);
        

      就是这样。

      完整代码:

              JSONObject json = new JSONObject("{\n" +
                  "   \"result\":{\n" +
                  "      \"issue_date\":\"20-02-2011\",\n" +
                  "      \"father/husband\":\"Chopra\",\n" +
                  "      \"name\":\"Variyar\",\n" +
                  "      \n" +
                  " \"img\":\"/9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS\",\n" +
                  "      \"blood_group\":\"\",\n" +
                  "      \"dob\":\"11-03-1981\",\n" +
                  "      \"validity\":{\n" +
                  "         \"non-transport\":\"24-03-2010 to 23-02-2030\",\n" +
                  "         \"transport\":\"\"\n" +
                  "      },\n" +
                  "      \"cov_details\":[\n" +
                  "         {\n" +
                  "            \"issue_date\":\"UNIT OFFICE,TRICHY\",\n" +
                  "            \"cov\":\"NCWG\"\n" +
                  "         }\n" +
                  "      ],\n" +
                  "      \"dl_number\":\"TN0290000784\",\n" +
                  "      \"address\":\"PERIYA COLONY  KO PAVAZHANGUDI  VIRUDHACHALAM TK\"\n" +
                  "   },\n" +
                  "   \"request_id\":\"a2642ae9-2f10-4e9a-9f7e-c3ee1a9a2dbe\",\n" +
                  "   \"status-code\":\"101\"\n" +
                  "}");
      
          System.out.println("Original img value: "+ json.getJSONObject("result").getString("img"));
      
          //SubString the img object:
          String imgObject = "\"img\": \"" + json.getJSONObject("result").getString("img") + "\",";
          System.out.println("img object key and value: "+imgObject);
      
          imgObject = imgObject.substring(8,imgObject.length()-2);
          imgObject = imgObject.replace("\",","");
      
          System.out.println("img object only value: "+imgObject);
      
          //convert json to string:
          String convertedJson = json.toString();
      
          //replace img
          convertedJson = convertedJson.replace(imgObject,"N/A");
      
      
          //convert back to JSONObject
          json = new JSONObject(convertedJson);
      
          System.out.println("Converted Json with new img value: "+ json.getJSONObject("result").getString("img"));
      

      【讨论】:

      • 它在此代码本身的第一行抛出错误不兼容的类型:字符串无法转换为映射
      • 我已经导入了 import org.json.simple.JSONObject;导入 org.json.simple.parser.JSONParser;还有什么需要吗?
      • 这是因为需要导入org.json.JSONObject;
      【解决方案5】:
      try {
              com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();
              java.util.LinkedHashMap obj = (java.util.LinkedHashMap) mapper.readValue(jsonString, Object.class);
              java.util.LinkedHashMap result = (java.util.LinkedHashMap) obj.get("result");
              result.put("img", "YOUR_VALUE");
              java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
              mapper.writeValue(bout, obj);
              byte[] objectBytes = bout.toByteArray();
              jsonString = new String(objectBytes);
          } catch (java.io.IOException e) {
              e.printStackTrace();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-16
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-10-26
        • 1970-01-01
        相关资源
        最近更新 更多