Как заменить значение в json файле

У меня есть файл JSON, то есть test.json.

{
  "Added": {
    "type": "K",
    "newmem": {
      "IDNew": {
        "id": "777709",
        "type": "LOP"
      },
      "birthDate": "2000-12-09"
    },
    "code": "",
    "newest": {
      "curlNew": "",
      "addedForNew": ""
    }
  }
}

Я пробовал следующий код:

File file = new File("test.json");
JSONParser parser = new JSONParser();

JSONObject data =  (JSONObject) parser.parse(
   new FileReader(file.getAbsolutePath()
));//path to the JSON file.
System.out.println(data.toString());

JSONObject jObject  = new JSONObject();
jObject.put("id","12345678");
System.out.println(jObject);

Получение результата: -

{
  "Added": {
    "type": "K",
    "newmem": {
      "IDNew": {
        "id": "777709",
        "type": "LOP"
      },
      "birthDate": "2000-12-09"
    },
    "code": "",
    "newest": {
      "curlNew": "",
      "addedForNew": ""
    }
  }
}{
"id":"12345678"
}

Значение id: «777709» не обновляется до id: «12345678», но оно наконец добавляется. Пожалуйста, помогите мне и подскажите, как заменить значение id.

Вам нужно снова записать этот json-объект в файл.

Pooja Aggarwal 21.11.2018 10:58

Вы не изменяете исходный объект. Вы только что создали новый пустой (jOjbect), добавили к нему элемент и распечатали. Вместо этого вам нужно изменить data.

Federico klez Culloca 21.11.2018 10:59

Возможный дубликат Обновить элементы в JSONObject

Arturo Seijas 21.11.2018 11:05

@FedericoklezCulloca Не могли бы вы помочь, как этого добиться? Я новичок в java и не получаю хороших ссылок в сети.

Little bird 21.11.2018 11:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
4
24 689
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете обновить вложенный элемент в JSONObject, используя java lib simple-json следующим образом:

JSONObject added = (JSONObject) data.get("Added");
JSONObject newmem = (JSONObject) added.get("newmem");
JSONObject idNew = (JSONObject) newmem.get("IDNew");
idNew.put("id","12345678");
System.out.println(data);

Я пробовал то же самое и наконец добавлял новое значение

Little bird 21.11.2018 11:27

получить (""). положить ("", ""); get не возвращают для меня какой-либо метод put.

Little bird 21.11.2018 11:37

Импортировали import org.json.JSONException; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException;

Little bird 21.11.2018 11:40

Вы окружили его ловушкой?

karan 21.11.2018 11:41

@KaranMer Да, я прокомментировал с помощью Try and Catch

Little bird 21.11.2018 11:44

проверьте обновленный ответ, вам нужно использовать getJSONObject вместо get

karan 21.11.2018 11:45

Я не вижу ни одного метода getJSONObject с данными

Little bird 21.11.2018 12:00

я только что понял, что вы используете simplejson, попробуйте обновленную версию

taygetos 21.11.2018 12:10
Ответ принят как подходящий

Вы можете попробовать это с помощью простой библиотеки json (библиотека). Я отдельно распечатываю весь объект для понимания. Поскольку вы объявляете объект Id внутри еще двух объектов, сначала вы должны получить этот объект, а затем получить свой объект желаемого IDNew. Затем введите новое значение id в поле id.

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Main {

    private static final String filePath = "E:\\project-test\\scloud\\test\\src\\main\\resources\\test";

    public static void main(String[] args) {

        try {
            // read the json file
            FileReader reader = new FileReader(filePath);

            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);

            System.out.println(jsonObject);


            JSONObject addedObj = (JSONObject) jsonObject.get("Added");
            System.out.println("Added is: " + addedObj);

            JSONObject newmemObject =(JSONObject) addedObj.get("newmem");
            System.out.println("newmemObject is: " + newmemObject);

            JSONObject idNewObj =(JSONObject) newmemObject.get("IDNew");
            System.out.println("IdNewObj is: " + idNewObj);

            long id =Long.valueOf((String) idNewObj.get("id"));
            System.out.println(id);


            idNewObj.put("id",809809809);

            System.out.println(jsonObject);

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParseException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }

    }

}

Или для простоты вы можете использовать это

    FileReader reader = new FileReader(filePath);
    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
    System.out.println(jsonObject);

    JSONObject idObj = (
       (JSONObject) (
             (JSONObject) (
                (JSONObject)
                   jsonObject.get("Added")
             ).get("newmem")
       ).get("IDNew")
    );

    idObj.put("id", 98009809);
    System.out.println("After ID value updated : "+jsonObject);

Спасибо ! Это сработало :) Я вижу напечатанные значения json в консоли. Как я могу записать одно и то же значение в один и тот же файл test.json?

Little bird 21.11.2018 12:27

попробуйте следующее: FileOutputStream outputStream = new FileOutputStream ("test"); byte [] strToBytes = jsonObject.toString (). getBytes (); outputStream.write (strToBytes);

flopcoder 21.11.2018 12:33

Еще одно решение с использованием другой библиотеки json-путь:

import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

import static org.assertj.core.api.Assertions.assertThat;

    @Test
    public void exampleToReplaceSingleElement_jsonTakenFromFile() throws IOException {
        String expectedId = "12345678";
        String expectedJson = "{\n" +
                "  \"Added\": {\n" +
                "    \"type\": \"K\",\n" +
                "    \"newmem\": {\n" +
                "      \"IDNew\": {\n" +
                "        \"id\": \"12345678\",\n" +
                "        \"type\": \"LOP\"\n" +
                "      },\n" +
                "      \"birthDate\": \"2000-12-09\"\n" +
                "    },\n" +
                "    \"code\": \"\",\n" +
                "    \"newest\": {\n" +
                "      \"curlNew\": \"\",\n" +
                "      \"addedForNew\": \"\"\n" +
                "    }\n" +
                "  }\n" +
                "}";

        Configuration configuration = Configuration
                .builder()
                .options(Option.SUPPRESS_EXCEPTIONS)
                .build();
        File json = new File("src/test/resources/test.json");
        System.out.println(json.getAbsolutePath());
        DocumentContext parsed = JsonPath.using(configuration).parse(json);

        parsed.set("$.Added.newmem.IDNew.id", expectedId);
        String actual = parsed.jsonString();

        log.info("After ID value updated: {}", actual);
        assertThat(actual).isEqualToIgnoringWhitespace(expectedJson);
    }

Примеры также доступны на get test exampleToReplaceSingleElement () или test exampleToReplaceSingleElement_jsonTakenFromFile ().

Другие вопросы по теме