web-dev-qa-db-ja.com

JavaのJSON文字列tidy / formatter

有効なJSON文字列があり、それを各プロパティ/値のペアが独自の行にあるように整頓/フォーマットします(現在は1行で、スペース/改行はありません)。

Apache Sling JSONObjectを使用してJSONオブジェクトをモデリングし、それを文字列に変換します。したがって、Sling JSONObjectが整頓された文字列を出力するように設定できる場合は(できません) )それも動作します。

サードパーティのライブラリが必要な場合は、可能な限り少ない依存関係を優先します(ジャクソンはstd JDKライブラリのみを必要とします)。

19
empire29

外部のライブラリは必要ありません。

SlingのJSONObjectに組み込まれているプリティプリンターを使用します。 http://sling.Apache.org/apidocs/sling5/org/Apache/sling/commons/json/JSONObject.html#toString(int

public Java.lang.String toString(int indentFactor)throws JSONException

このJSONObjectのprettyprinted JSONテキストを作成します。警告:このメソッドは、データ構造が非周期的であることを前提としています。

パラメーター:

indentFactor-各レベルのインデントに追加するスペースの数。

戻り値:オブジェクトの印刷可能、表示可能、移植可能、送信可能な表現。{(左中括弧)で始まり、}(右中括弧)で終わります。

例外:JSONException-オブジェクトに無効な数値が含まれている場合。

23
Freiheit

Gsonでできること:

JsonParser parser = new JsonParser();
Gson gson = new GsonBuilder().setPrettyPrinting().create();

JsonElement el = parser.parse(jsonString);
jsonString = gson.toJson(el); // done
38
Ali Shakiba

多くのJSONライブラリには、特別な.toString(int indentation)メソッドがあります

// if it's not already, convert to a JSON object
JSONObject jsonObject = new JSONObject(jsonString);
// To string method prints it with specified indentation
System.out.println(jsonObject.toString(4));
20
Oded Breiner

JohnSのgsonの回答については+1ですが、「標準」のJSONObjectライブラリを使用した方法は次のとおりです。

public class JsonFormatter{

    public static String format(final JSONObject object) throws JSONException{
        final JsonVisitor visitor = new JsonVisitor(4, ' ');
        visitor.visit(object, 0);
        return visitor.toString();
    }

    private static class JsonVisitor{

        private final StringBuilder builder = new StringBuilder();
        private final int indentationSize;
        private final char indentationChar;

        public JsonVisitor(final int indentationSize, final char indentationChar){
            this.indentationSize = indentationSize;
            this.indentationChar = indentationChar;
        }

        private void visit(final JSONArray array, final int indent) throws JSONException{
            final int length = array.length();
            if(length == 0){
                write("[]", indent);
            } else{
                write("[", indent);
                for(int i = 0; i < length; i++){
                    visit(array.get(i), indent + 1);
                }
                write("]", indent);
            }

        }

        private void visit(final JSONObject obj, final int indent) throws JSONException{
            final int length = obj.length();
            if(length == 0){
                write("{}", indent);
            } else{
                write("{", indent);
                final Iterator<String> keys = obj.keys();
                while(keys.hasNext()){
                    final String key = keys.next();
                    write(key + " :", indent + 1);
                    visit(obj.get(key), indent + 1);
                    if(keys.hasNext()){
                        write(",", indent + 1);
                    }
                }
                write("}", indent);
            }

        }

        private void visit(final Object object, final int indent) throws JSONException{
            if(object instanceof JSONArray){
                visit((JSONArray) object, indent);
            } else if(object instanceof JSONObject){
                visit((JSONObject) object, indent);
            } else{
                if(object instanceof String){
                    write("\"" + (String) object + "\"", indent);
                } else{
                    write(String.valueOf(object), indent);
                }
            }

        }

        private void write(final String data, final int indent){
            for(int i = 0; i < (indent * indentationSize); i++){
                builder.append(indentationChar);
            }
            builder.append(data).append('\n');
        }

        @Override
        public String toString(){
            return builder.toString();
        }

    }

}

使用法:

public static void main(final String[] args) throws JSONException{
    final JSONObject obj =
            new JSONObject("{\"glossary\":{\"title\": \"example glossary\", \"GlossDiv\":{\"title\": \"S\", \"GlossList\":{\"GlossEntry\":{\"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\":{\"para\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\"]}, \"GlossSee\": \"markup\"}}}}}");
    System.out.println(JsonFormatter.format(obj));
}

出力:

{
    glossary :
    {
        title :
        "example glossary"
        ,
        GlossDiv :
        {
            GlossList :
            {
                GlossEntry :
                {
                    SortAs :
                    "SGML"
                    ,
                    GlossDef :
                    {
                        GlossSeeAlso :
                        [
                            "GML"
                            "XML"
                        ]
                        ,
                        para :
                        "A meta-markup language, used to create markup languages such as DocBook."
                    }
                    ,
                    GlossSee :
                    "markup"
                    ,
                    GlossTerm :
                    "Standard Generalized Markup Language"
                    ,
                    ID :
                    "SGML"
                    ,
                    Acronym :
                    "SGML"
                    ,
                    Abbrev :
                    "ISO 8879:1986"
                }
            }
            ,
            title :
            "S"
        }
    }
}
7
    public static String formatJSONStr(final String json_str, final int indent_width) {
    final char[] chars = json_str.toCharArray();
    final String newline = System.lineSeparator();

    String ret = "";
    boolean begin_quotes = false;

    for (int i = 0, indent = 0; i < chars.length; i++) {
        char c = chars[i];

        if (c == '\"') {
            ret += c;
            begin_quotes = !begin_quotes;
            continue;
        }

        if (!begin_quotes) {
            switch (c) {
            case '{':
            case '[':
                ret += c + newline + String.format("%" + (indent += indent_width) + "s", "");
                continue;
            case '}':
            case ']':
                ret += newline + ((indent -= indent_width) > 0 ? String.format("%" + indent + "s", "") : "") + c;
                continue;
            case ':':
                ret += c + " ";
                continue;
            case ',':
                ret += c + newline + (indent > 0 ? String.format("%" + indent + "s", "") : "");
                continue;
            default:
                if (Character.isWhitespace(c)) continue;
            }
        }

        ret += c + (c == '\\' ? "" + chars[++i] : "");
    }

    return ret;
}
4
Janardhan

あなたがCQ5またはJCRベースのCMSを使用していると思います:)

Java jsonパーサーを使用してジョブを実行できます。JSONObjectクラスとそれをStringに変換するtoString()メソッドがあります。

さらに参照するには

http://json.org/Java/

1
Rajesh Pantula

ジャクソンの方法:

private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
...
OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(node);
1
Thorsten Hilker

JSON文字列には、先頭に「[」と末尾に「]」が付きます。これらを削除してから、Stringのsplitメソッドを使用して、アイテムを配列に分離します。その後、配列を反復処理し、データを関連する領域に配置できます。

1
Travis J

Underscore-Javaには、統計メソッドU.formatJson(json)があります。私は図書館の管理者です。

0