写入文件时追加JSONObjects

时间:2019-01-13 00:48:10

标签: java android json android-file

我正在尝试将<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <IsPackable>false</IsPackable> </PropertyGroup> <ItemGroup> <PackageReference Include="nunit" Version="3.11.0" /> <PackageReference Include="NUnit3TestAdapter" Version="3.11.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> </ItemGroup> </Project> 附加到称为JSONObjects的JSONArray中。

我第一次保存它时,可以用这种方式保存它

Records

但是当我尝试在Records中再次附加一个新的jsonobject时,它会为其创建一个新的JSONArray,而我只想在Records中附加一个新的对象

{
  "Records": [
    {
      "travelTime": 2,
      "totalDistance": 0,
      "pace": 0,
      "kCalBurned": 0,
      "latlng": "[lat\/lng: (-32.1521234,-63.66412321)]"
    }
  ]
}

这是我用来保存{ "Records": [ { "travelTime": 2, "totalDistance": 0, "pace": 0, "kCalBurned": 0, "latlng": "[lat\/lng: (-31.6432292,-63.3667462)]" } ] }{ "Records": [ { "travelTime": 1, "totalDistance": 0, "pace": 0, "kCalBurned": 0, "latlng": "[lat\/lng: (-31.9522431,-64.3461241)]" } ] } 的代码

Records

2 个答案:

答案 0 :(得分:1)

您需要一个JSON解析器,以便可以在文件内找到“ Records”数组并将新数据放置在其中。我使用了“ json简单”库(可以在https://code.google.com/archive/p/json-simple/downloads中找到jar)。

首先,您分析文件:

JSONParser parser = new JSONParser();
JSONObject records = null;
try {
    records = (JSONObject) parser.parse(new FileReader("records.json"));
} catch (ParseException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}

然后找到Records JSONArray。您要在其中追加新记录:

 JSONArray r = (JSONArray) records.get("Records");

创建新记录:

JSONObject NewObj = new JSONObject();
NewObj.put("travelTime", travelTime);
NewObj.put("totalDistance", totalDistance);
NewObj.put("pace", pace);
NewObj.put("kCalBurned", kCalBurned);
NewObj.put("latlng", latlng);

将新记录添加到“记录” JSONArray:

r.add(NewObj);

写入文件:

try (FileWriter file = new FileWriter("records.json")) {
     file.write(records.toJSONString());
} catch (IOException ex) {
     ex.printStackTrace();
}

答案 1 :(得分:1)

  

将第二个参数传递给true构造函数中的FileOutputStream   在文件末尾附加jsonObject。

要将其与JSON数组附加在Records对象中,必须首先读取文件,附加新的JSON对象并将其写回到文件中。

使用GSON库在java类和jSON之间进行转换。因此,您不必每次都通过放置每个密钥对来手动创建JSON对象。

创建一个Java类来容纳整个Records对象

public class Record
{
    @SerializedName("Records")
    private List<Object> recordsList;

    public Record()
    {
        this. recordsList = new ArrayList<>();
    }

    public List<Object> getRecordsList()
    {
        return recordsList;
    }
}

现在创建JAVA Model class来保存旅行信息

public class Travel {

    private Integer travelTime;
    private Integer totalDistance;
    private Integer pace;
    private Integer kCalBurned;
    private LinkedList<LatLng> latlng;

    public Integer getTravelTime() {
        return travelTime;
    }

    public void setTravelTime(Integer travelTime) {
        this.travelTime = travelTime;
    }

    public Integer getTotalDistance() {
        return totalDistance;
    }

    public void setTotalDistance(Integer totalDistance) {
        this.totalDistance = totalDistance;
    }

    public Integer getPace() {
        return pace;
    }

    public void setPace(Integer pace) {
        this.pace = pace;
    }

    public Integer getKCalBurned() {
        return kCalBurned;
    }

    public void setKCalBurned(Integer kCalBurned) {
        this.kCalBurned = kCalBurned;
    }

    public LinkedList<LatLng> getLatlng() {
        return latlng;
    }

    public void setLatlng(LinkedList<LatLng> latlng) {
        this.latlng = latlng;
    }

}

这是实用程序类,带有在Records对象内附加新JSON的函数。它将检查是否创建了目录和文件,否则将创建两个目录和文件。如果文件存在,它将读取文件,将新的JSON对象附加到列表中并将其写回到同一文件中。您可以使用自己的目录和文件名进行更改。

注意:该课程是用Kotlin编写的。这是参考文献how to setup Android Studio for Kotlin

class Logger {

    companion object {

        private const val LOG_FILE_FOLDER = "Logs"
        private const val LOG_FILE_NAME = "transaction"
        private const val DATE_FORMAT = "yyyy-MM-dd"
        private val logFileName: String
            @SuppressLint("SimpleDateFormat")
            get() {

                var fileName = LOG_FILE_NAME
                val dateFormat = SimpleDateFormat(DATE_FORMAT)
                fileName += "_" + dateFormat.format(Date()) + ".json"
                return fileName
            }

fun logFile(json: Any) {

try {
    val directoryPath = Environment.getExternalStorageDirectory().path + "/" + LOG_FILE_FOLDER
    val loggingDirectoryPath = File(directoryPath)
    var loggingFile = File("$directoryPath/$logFileName")
    if (loggingDirectoryPath.mkdirs() || loggingDirectoryPath.isDirectory) {
        var isFileReady = true
        var isNewFile = false
        if (!loggingFile.exists()) {
            isFileReady = false
            try {
                loggingFile.createNewFile()
                isNewFile = true
                isFileReady = true
            } catch (e: Exception) {
                e.printStackTrace()
            }

        } else {
            val lastFile = getLastFile(loggingFile.name, directoryPath)
            loggingFile = File("$directoryPath/$lastFile")
            val fileSize = getFileSize(loggingFile)

        }
        if (isFileReady) {

            var jsonString: String? = null

            if (!isNewFile) {

                //Get already stored JsonObject
                val stream = FileInputStream(loggingFile)


                try {
                    val fileChannel = stream.channel
                    val mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size())

                    jsonString = Charset.defaultCharset().decode(mappedByteBuffer).toString()
                } catch (e: Exception) {
                    e.printStackTrace()
                } finally {
                    stream.close()
                }
            }


            //Create record object
            val record = if (!jsonString.isNullOrEmpty()) {
                Gson().fromJson(jsonString, Record::class.java)
            } else {
                Record()
            }


            //Append the current json
            record.recordList.add(json)

            //create json to save
            val jsonToSave = Gson().toJson(record)

            val bufferedOutputStream: BufferedOutputStream
            try {
                bufferedOutputStream = BufferedOutputStream(FileOutputStream(loggingFile))
                bufferedOutputStream.write(jsonToSave.toByteArray())
                bufferedOutputStream.flush()
                bufferedOutputStream.close()

            } catch (e4: FileNotFoundException) {
                e4.printStackTrace()
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                System.gc()
            }
        }
    }
} catch (ex: Exception) {
    ex.printStackTrace()
}
}
}
}

最后,您可以使用logFile方法记录文件

Logger.Companion.logFile(travel);

干杯:)