简体   繁体   中英

How to modify values inside JSON object in Java

I have a JSON Object which looks like this.

{
   "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"
}

I want to edit the values inside of "img" which is inside "result" using java.

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

But it did not work. My expected output is that the Img tag should be like this

 "img":"N/A",     

Any suggestion on how to achieve this?

Try something like this. Below is both options to delete or update the data. Use 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());

You can use any of the popular Json serialization libraries to convert Java objects to Json and the other way around:

In the case of Jackson, your objects in Java would look something like this:

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);
}

}

You can then serialize the Json to Java objects by running the following code:

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

Whereby the json variable refers to your Json data. After you have your Java objects, you can simply use the getters and setters to adjust the objects to your needs.

result.setRequestId("Test");

In case you want to edit the img property:

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

If you then want to convert the Java objects back to Json, you could do something like this:

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

Source of the Java classes: http://www.jsonschema2pojo.org/

Solution using simple org.json library(*without using POJO classes)

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);
    }

}

Output:

 {
   "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"
}

I suggest using Strings to replace "img" object as follow (no matter what "img" value or length you have):

  1. First get the "img" object value as string:

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

output will be:

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

  1. Then extract only the "img" value:

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

Output will be:

/9j/4AAQSkZJRgABAQAABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKS

  1. Convert the original Json to string:

     String convertedJson = json.toString();
  2. replace "img" with "N/A":

     convertedJson = convertedJson.replace(imgObject,"N/A");
  3. convert back to JSONObject:

     json = new JSONObject(convertedJson);

and that's it.

Complete code:

        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"));
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();
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM