ObjectOutputStream.writeUTF записывает поврежденные символы в начале - PullRequest
0 голосов
/ 07 января 2019

это мой файл .json:

{"Usuarios":[{"password":"admin","apellido":"Admin","correo":"Adminadmin.com","direccion":"Admin","telefono":"Admin","nombre":"Admin","username":"admin"}]}

(я пытался как можно лучше перевести свой код с испанского на английский в комментариях <3) </p>

Функция, которая пишет в JSON:

 public void agregarUsuario(String nombre, String apellido, String direccion, String telefono, String correo, String username, String password) {
    try {
        //String jsonString = JsonObject.toString();

        JSONObject usuarios = getJSONObjectFromFile("/usuarios.json"); 
        JSONArray listaUsuario = usuarios.getJSONArray("Usuarios");     
        JSONObject newObject = new JSONObject();                        
        newObject.put("nombre", nombre);
        newObject.put("apellido", apellido);
        newObject.put("direccion", direccion);
        newObject.put("telefono", telefono);
        newObject.put("correo", correo);
        newObject.put("username",username);
        newObject.put("password", password);

        listaUsuario.put(newObject);                                    
        usuarios.put("Usuarios",listaUsuario);  

        ObjectOutputStream outputStream = null;

        outputStream = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Victor\\eclipse-workspace\\Iplane\\assets\\usuarios.json"));

        outputStream.writeUTF(usuarios.toString());
        outputStream.flush();
        outputStream.close();

    }catch(JSONException e) {
        e.printStackTrace();
    }catch(Exception e) {
        System.err.println("Error writting json: " + e);
    }

Итак, если в моем окне JFrame «создать пользователя» я создаю нового пользователя с «asdf» в качестве информации во всех данных пользователя, я должен получить следующий файл JSON:

{"Usuarios":[{"password":"admin","apellido":"Admin","correo":"Adminadmin.com","direccion":"Admin","telefono":"Admin","nombre":"Admin","username":"admin"},{"password":"asdf","apellido":"asdf","correo":"asdf","direccion":"asdf","telefono":"asdf","nombre":"asdf","username":"asdf"}]}

И да! что происходит! но я также получил некоторые странные символы ascii / Unicode впереди, если мой основной объект JSON. Я не могу скопировать вывод здесь, так что это мой вывод на imgur: ссылка .

Почему возникает эта проблема? как я мог это исправить? Если кому-то нужна моя программа чтения файлов json (может, проблема в этом), то вы идете:

    public static InputStream inputStreamFromFile(String path) {
    try {
        InputStream inputStream = FileHandle.class.getResourceAsStream(path); //charge json in "InputStream"
        return inputStream;
    }catch(Exception e) {
        e.printStackTrace(); //tracer for json exceptions
    }
    return null;
}
 public static String getJsonStringFromFile(String path) {
        Scanner scanner;
        InputStream in = inputStreamFromFile(path); //obtains the content of the .JSON and saves it in: "in" variable
        scanner = new Scanner(in);                              //new scanner with inputStream "in" info
        String json= scanner.useDelimiter("\\Z").next();        //reads .JSON and saves it in string "json"
        scanner.close();                                        //close the scanner
        return json;                                            //return json String
     }
 public static boolean objectExists (JSONObject jsonObject, String key) { //verifies whether an object exist in the json
     Object o;
     try {
         o=jsonObject.get(key);
     }catch(Exception e) {
         return false;
     }
     return o!=null;
 }

  public static JSONObject getJSONObjectFromFile(String path) {    //creates a jsonObject from a path
     return new JSONObject(getJsonStringFromFile(path));
 }

Итак, после записи в файл JSON я ничего не могу с ним поделать, потому что с этими странными символами у меня возникли ошибки в моем json: "extraneus input: (здесь символы) ожидают [STRING, NUMBER, TRUE, FALSE , {... "

1 Ответ

0 голосов
/ 07 января 2019

writeUTF не записывает стандартный Unicode, но дополняет вывод двумя байтами информации о длине

Если вы намеренно используете writeUTF, вам придется использовать readUTF, чтобы снова прочитать данные. В противном случае я бы предложил использовать OutputStreamWriter.

writeUTF ()

Записывает два байта информации о длине в выходной поток с последующим модифицированным представлением UTF-8 каждого символа в строке s. Если s равно null, генерируется исключение NullPointerException. Каждый персонаж в строка s преобразуется в группу из одного, двух или трех байтов, в зависимости от значения символа.


** Изменить, чтобы уточнить OutputStreamWriter:

Чтобы использовать OutputStreamWriter, просто замените ObjectOutputStream на OutputStreamWriter и используйте write вместо writeUTF.

Вы можете найти этот небольшой учебник полезным: Java IO: OutputStreamWriter на jenkov.com

...