2

I have this json file I downloaded online:

 {
"price": 1,
"empty": [
  0,
  0,
  0,
  0,
  0
],
"lowValue": 0,
"highValue": 0
},

and I want to delete everything from

"empty": [

to

],

I've spent a few hours looking at regex stuff and I can't seem to figure out how to make it do what I want it to do.

Edit: Annamalai Thangaraj's method works until I add more to the file.

{
"price": 1,
"empty": [
  0,
  0,
  0,
  0,
  0
],
"lowValue": 0,
"highValue": 0
},
{
"price": 500,
"empty": [
  5,
  0,
  3,
  6,
  9
],
"lowValue": 4,
"highValue": 2
}

which now I'm given an error:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.JsonArray cannot be cast to com.google.gson.JsonObject

My code is exactly:

public static void go() throws IOException {
    JsonObject jsonObject = (JsonObject)JsonParser.parse(new FileReader(location));
    jsonObject.remove("empty");

    JsonArray jsonArray = (JsonArray)JsonParser.parse(new FileReader(location));


    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    JsonParser jp = new JsonParser();
    JsonElement je = jp.parse(jsonObject.toString());
    String prettyJsonString = gson.toJson(je);

    FileWriter file = new FileWriter(System.getProperties().getProperty("user.home")+"\\output.json");
    try {
        file.write(prettyJsonString);
        System.out.println("Successfully wrote JSON object to file.");

    } catch (IOException e) {
        e.printStackTrace();

    } finally {
        file.flush();
        file.close();
    }
}
4
  • How robust does this need to be? Are you only dealing with that exact text? Files in that format, but with potentially different values? Arbitrary JSON? Commented Apr 10, 2015 at 3:42
  • Yes, files in that format but with different values. There's 1,666,144 lines of that Commented Apr 10, 2015 at 3:43
  • 2
    You may want to use a JSON library. There's a list available on json.org Commented Apr 10, 2015 at 3:44
  • ...so you want to get rid of the "empty" key? Commented Apr 10, 2015 at 5:12

4 Answers 4

3

Use the following code to remove element empty from json

JSONObject jsonObject = (JSONObject) jsonParser.parse(new FileReader("File Path"));
jsonObject .remove("empty");

After removing empty element using jsonObject.toJSONString() to get target JSON, Now structure of JSON will be look like this

 {
"price": 1,
"lowValue": 0,
"highValue": 0
},
Sign up to request clarification or add additional context in comments.

Comments

1

Use a JSON library like Jackson:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.IOException;

public class JsonDelete {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{\"key\":\"value\",\"empty\":[]}";

        ObjectNode node = (ObjectNode) mapper.readTree(json);
        node.remove("empty");

        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(node));
    }

}

Outputs:

{
  "key" : "value"
}

Comments

0

If you put a '[' at the beginning and a ']' at the end of json file, it becomes a valid json file. Like in your json file, It should be.

[
    {
    "price": 1,
    "empty": [
      0,
      0,
      0,
      0,
      0
    ],
    "lowValue": 0,
    "highValue": 0
    },
    {
    "price": 500,
    "empty": [
      5,
      0,
      3,
      6,
      9
    ],
    "lowValue": 4,
    "highValue": 2
    }
]

So the final program will be like:--

public class ReadJSONFromFile {
    public static void main(String[] args) {
        JSONParser parser = new JSONParser();
        try {
            Object obj = parser.parse(new FileReader("locationOfFIle"));
            JSONArray array = (JSONArray) obj;
            FileWriter file = new FileWriter("locationOfFIle");
            for (int index = 0; index < array.size(); ++index) {
                JSONObject jsonObject = (JSONObject) array.get(index);
                jsonObject.remove("empty");
                file.write(jsonObject.toJSONString());
                file.flush();
                if (index == array.size() - 1)
                    file.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Comments

0

You can also parse your json by ignoring some fields. Look at this example:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

@JsonIgnoreProperties(value = { "empty" })
public class Item {

    private long price;
    private long lowValue;
    private long highValue;

    public long getPrice() {
        return price;
    }

    public void setPrice(long price) {
        this.price = price;
    }

    public long getLowValue() {
        return lowValue;
    }

    public void setLowValue(long lowValue) {
        this.lowValue = lowValue;
    }

    public long getHighValue() {
        return highValue;
    }

    public void setHighValue(long highValue) {
        this.highValue = highValue;
    }

    @Override
    public String toString() {
        return "Item [price=" + price + ", lowValue=" + lowValue + ", highValue=" + highValue + "]";
    }

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

        String file = "c:\\json";

        ObjectMapper mapper = new ObjectMapper();

        Item[] items = mapper.readValue(new File(file), Item[].class);
        for (Item item : items) {
            System.out.println(item);
        }

    }

}

c:\json contains:

    [
    {
        "price": 1,
        "empty": [
          0,
          0,
          0,
          0,
          0
        ],
        "lowValue": 0,
        "highValue": 0
    },
    {
        "price": 2,
        "empty": [
          0,
          0,
          0,
          0,
          0
        ],
        "lowValue": 3,
        "highValue": 4
    }
]

Output is:

Item [price=1, lowValue=0, highValue=0]
Item [price=2, lowValue=3, highValue=4]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.