Android - 在adb logcat输出中格式化JSON字符串

33

为了记录日志目的,我会打印出JSON响应字符串并在android "adb logcat"命令中查看它们。有没有一种方法可以在adb logcat输出中以良好的格式呈现JSON字符串,使其看起来像这样?

{ "code" : "0",
  "text" : "hello world"
} 
4个回答

72
您可以使用JSONObject.toString()方法在logcat上美化打印JSON。
Log.d("tag", jsonObject.toString(4));

输出

(29124): {
(29124):     "text": "hello world",
(29124):     "code": "0"
(29124): }

3
在Log.d("tag", jsonObject.toString(4));中,“4”表示缩进级别,用于将JSON对象格式化为易读的文本形式。 - Compaq LE2202x
2
是的,它是一个缩进因子。 - Deepak Bala
我该如何完全禁用格式化?(以便我的JSON输出在一行中) - Alex Semeniuk
你如何抑制(29124):这部分? - Nouvel Travay
确保你处理了它抛出的 JSONException 异常。 - Sevastyan Savanyuk
2
它无法打印超过1000个字符的JSON,有什么办法可以以可读格式记录所有2000个字符的JSON? - Rahul

7

在代码中,我不会对JSON消息进行漂亮的打印。我只需要在Mac上的LogRabbit中双击该消息,它就会漂亮地打印出来,或者突出显示Base64以进行解码。

enter image description here

完全公开透明,我是Mac版LogRabbit的创建者。


我在这里添加了一个视频教程,讲解如何过滤包含 JSON 的所有消息的 logcat 文件:https://www.youtube.com/watch?v=HeildKynnuc - Yepher

3
你可以使用我的日志记录器代码,以原始格式在日志中格式化json:
Logger.dd("Section label", json);

Link on Github: https://github.com/scijoker/logger Source:
import android.os.Build;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Created by scijoker on 08.10.15.
 */
public class Logger {
    private static boolean DEBUG = true;

    public static void d(String tag, String arg) {
        if (isEnable()) {
            log(tag, arg);
        }
    }

    public static void d(String logMsg) {
        if (isEnable()) {
            log(getCurrentClassName(), getCurrentMethodName() + "(): " + logMsg);
        }
    }

    public static void dd(String tag, Object source) {
        if (isEnable()) {
            Object o = getJsonObjFromStr(source);
            if (o != null) {
                try {
                    if (o instanceof JSONObject) {
                        format(tag, ((JSONObject) o).toString(2));
                    } else if (o instanceof JSONArray) {
                        format(tag, ((JSONArray) o).toString(2));
                    } else {
                        format(tag, source);
                    }
                } catch (JSONException e) {
                    format(tag, source);
                }
            } else {
                format(tag, source);
            }
        }
    }

    private static void log(String tag, String msg) {
        Log.d(tag, msg);
    }

    private static String getSplitter(int length) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < length; i++) {
            builder.append("-");
        }
        return builder.toString();
    }

    private static void format(String tag, Object source) {
        tag = " " + tag + " ";
        log(" ", " ");
        log(" ", getSplitter(50) + tag + getSplitter(50));
        log(" ", "" + source);
        log(" ", getSplitter(100 + tag.length()));
        log(" ", " ");
    }

    private static String getCurrentMethodName() {
        return Thread.currentThread().getStackTrace()[4].getMethodName();
    }

    private static String getCurrentClassName() {
        String className = Thread.currentThread().getStackTrace()[4].getClassName();
        String[] temp = className.split("[\\.]");
        className = temp[temp.length - 1];
        return className;
    }

    private static Object getJsonObjFromStr(Object test) {
        Object o = null;
        try {
            o = new JSONObject(test.toString());
        } catch (JSONException ex) {
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    o = new JSONArray(test);
                }
            } catch (JSONException ex1) {
                return null;
            }
        }
        return o;
    }

    public static boolean isEnable() {
        return DEBUG;
    }

    public static void setEnable(boolean flag) {
        Logger.DEBUG = flag;
    }
}

1
fastJson 提供了一个方法:
//serialize a prettyFormat json string 

public static final String toJSONString(Object object, boolean prettyFormat);

eg:Log.d(TAG,JSON.toJSONString(object, true));

 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接