-1

ローカル ディレクトリから JSON フィードを読み込んでおり、他のファイルに保存する前にそれを変更したいと考えています。

これはJSONフィードのオンライン バージョンです

構造は次のようになります。

[
  {
    "title":"chapter Title", 
    "arr":[
            {
             "title":"SubChapter Title",        
             "arr":[
                     [
                      "Sub Sub Chapter Title", 
                       272, 
                       1124, 
                       10550, 
                       11044,
                       -11172,
                       ......
                     ],
                     ........
             ............
       ...........
.......

JSON次のように、既存のファイルに問題のタイトルと問題番号を追加する必要があります。

[
  {
    "title":"chapter Title", 
    "arr":[
            {
             "title":"SubChapter Title",        
             "arr":[
                     [
                      "Sub Sub Chapter Title", 
                       272, "This is a title",
                       1124, "This is another title",
                       10550, ".....",
                       11044, "......",
                       -11172, "......",
                       ......
                     ],
                     ........
             ............
       ...........
.......

それらを追加するために、問題のタイトルを問題番号に既にマップしています。フィード文字列を読んで、それらをにproblem No置き換えるを見つけます。これは私の試みのコードです:problem Noproblem Title

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import com.google.gson.stream.JsonReader;

public class JacksonStreamAPIExample {

    static String PROBLEM_LIST_FILE_PATH = "F:\\problemList.txt";
    static String COMPETITIVE_PROGRAMMING_BOOK_PATH = "F:\\competitive_programming_edition_3.json";
    static String TARGET_PATH = "F:\\target.json";

    static HashMap<Integer, String> problems = new HashMap<Integer, String>();

    public static void main(String[] args) {
        // Mapping problem No with problem Title
        InputStream is = null;
        try {
            is = new FileInputStream(PROBLEM_LIST_FILE_PATH);
        } catch (FileNotFoundException e1) {

        }
        JsonReader reader = null;
        try {
            reader = new JsonReader(new InputStreamReader(is, "UTF-8"));
        } catch (UnsupportedEncodingException e1) {

        }
        try {
            reader.beginArray();
            while (reader.hasNext()) {
                reader.beginArray();
                reader.skipValue();
                problems.put(reader.nextInt(), reader.nextString());
                reader.skipValue();
                while (reader.hasNext())
                    reader.skipValue();
                reader.endArray();
            }
            reader.endArray();
            reader.close();
        } catch (IOException e) {
        }

        // Reading and modifying
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(COMPETITIVE_PROGRAMMING_BOOK_PATH);
        } catch (FileNotFoundException e) {
            System.out.println("file not found!");
        }
        InputStreamReader isr = null;
        isr = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
        BufferedReader read = new BufferedReader(isr, 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = read.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
        }
        try {
            inputStream.close();
        } catch (IOException e) {

        }
        String jsonString = sb.toString();

        try {
            String regex = ", (-?\\d+)";
            Pattern myPattern = Pattern.compile(regex);
            Matcher regexMatcher = myPattern.matcher(jsonString);

            while (regexMatcher.find()) {
                for (int i = 1; i <= regexMatcher.groupCount(); i++) {
                 System.out.println("I want to add " + problems.get(Math.abs(Integer.parseInt(regexMatcher.group(i)))) + " after " + regexMatcher.group(i) + " in jsonString and write it in target file.");
                }
            }
        } catch (PatternSyntaxException ex) {

        }
        Path path = Paths.get(TARGET_PATH);
        try {
            Files.write(path, jsonString.getBytes(StandardCharsets.UTF_8));
        } catch (IOException e) {

        }
    }
}

すべてが大丈夫です。問題番号以降の問題タイトルの差し替え・追加のみ動作しません。どうすればこれを行うことができますか?

4

1 に答える 1

0

@デイブ・ニュートンは正しいです。JSONオブジェクトを作成することでそれを行う必要がありJSONWriterます。JSONwithインスタンスを解析し、でJsonReader順番に追加しますJsonWriterproblemTitleさらに、既に完了したマッピングから を追加します。

幸いなことに、私はあなたに代わってあなたの仕事を完了しました。少しの変更でうまくいくことを願っています。

package demo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

import java.util.HashMap;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

public class JacksonStreamAPIExample {

    static String PROBLEM_LIST_FILE_PATH = "F:\\kaidul.txt";
    static String COMPETITIVE_PROGRAMMING_BOOK_PATH = "F:\\competitive_programming_edition_3.json";
    static String TARGET_PATH = "F:\\test.json";

    static HashMap<Integer, String> problems = new HashMap<Integer, String>();

    public static void main(String[] args) {
        // Mapping problem No with problem Title
        InputStream is = null;
        try {
            is = new FileInputStream(PROBLEM_LIST_FILE_PATH);
        } catch (FileNotFoundException e) {

        }
        try {
            JsonReader reader  = new JsonReader(new InputStreamReader(is, StandardCharsets.UTF_8));
            reader.beginArray();
            while (reader.hasNext()) {
                reader.beginArray();
                reader.skipValue();
                problems.put(reader.nextInt(), reader.nextString());
                reader.skipValue();
                while (reader.hasNext())
                    reader.skipValue();
                reader.endArray();
            }
            reader.endArray();
            reader.close();
        } catch (IOException e) {
        }

        // Reading and modifying
        JsonWriter writer = null;
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(COMPETITIVE_PROGRAMMING_BOOK_PATH);

            JsonReader reader = new JsonReader(new InputStreamReader(
                    inputStream));
            writer = new JsonWriter(new FileWriter(TARGET_PATH));

            reader.beginArray(); // array #1
            writer.beginArray();
            while (reader.hasNext()) {
                reader.beginObject(); // object #2
                writer.beginObject();
                while (reader.hasNext()) {
                    reader.skipValue();
                    writer.name("title").value(reader.nextString());
                    reader.skipValue();
                    writer.name("arr");
                    reader.beginArray(); // array #3
                    writer.beginArray();
                    while (reader.hasNext()) {
                        reader.beginObject(); // object #4
                        writer.beginObject();
                        while (reader.hasNext()) {
                            reader.skipValue();
                            writer.name("title").value(reader.nextString());
                            reader.skipValue();
                            writer.name("arr");
                            reader.beginArray(); // array #5
                            writer.beginArray();
                            while (reader.hasNext()) {
                                reader.beginArray(); // array #6
                                writer.beginArray();
                                writer.value(reader.nextString());
                                while (reader.hasNext()) {
                                    int problemNo = reader.nextInt();
                                    writer.value(problemNo);
                                    writer.value(problems.get(Math.abs(problemNo))); // additional problemTitle
                                }
                                reader.endArray(); // array #6
                                writer.endArray();
                            }
                            reader.endArray(); // array #5
                            writer.endArray();
                        }
                        reader.endObject(); // object #4
                        writer.endObject();
                    }
                    reader.endArray(); // array #3
                    writer.endArray();
                }
                reader.endObject(); // object #2
                writer.endObject();
            }
            reader.endArray(); // array #1
            writer.endArray();
            reader.close();
            writer.close();
        } catch (IOException e) {
            // nothing
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    // nothing
                }
            }
        }
    }
}
于 2013-08-14T21:51:51.670 に答える