﻿# 如何讓 LINQPad 輸出的 JSON 結果可以顯示語法高亮

我經常透過 [LINQPad](https://www.linqpad.net/) 撰寫一些範例程式或實驗一些 C# 的新特性，其中最常使用的一個 API 就是 LINQPad 內建的 `.Dump()` 擴充方法了，他可以將一些執行結果輸出在結果視窗中，非常方便。如果要說缺點，應該就是沒有語法高亮(Syntax Highlight)了吧！這篇文章我來分享一個小技巧，幫助你在輸出結果呈現語法高亮！👍

![LINQPad](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/829da20ddf5c509088b3-212119585-703df272-df17-45fc-974d-e23a63b84bd2.png)

### 先看看執行結果

-   先看看預設的 `.Dump()` 輸出結果
    
    結果會輸出在 `Results` 預設頁籤中，：
    
    ![.Dump()](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/87e80b3e18f5898d5c81-212114196-c2ce2cd8-c1f5-46b9-862f-3a132ed7362e.png)
    
-   再看看我自己擴充的 `.DumpJson()` 輸出結果
    
    結果會輸出在 `JsonResult` 自訂頁籤中，跟 `Results` 是分開的：
    
    ![.DumpJson()](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/dad5845b7211fb110722-212114213-16b04c85-dfb3-4f59-a451-d3b3ec760d58.png)
    

### 如何自訂 LINQPad 擴充方法

1.  先開啟 `My Documents\LINQPad Plugins\NetCore3\MyExtensions.linq` 檔案
    
    這是預設給 LINQPad 使用者用來擴充查詢視窗程式的地方，該檔案有個 `public static class MyExtensions` 靜態類別，專門讓你在這裡寫上各種擴充方法！
    
    預設內容如下：
    
    ```csharp
    void Main()
    {
      // Write code to test your extensions here. Press F5 to compile and run.
    }
    
    public static class MyExtensions
    {
        // Write custom extension methods here. They will be available to all queries.
    }
    
    
    // You can also define namespaces, non-static classes, enums, etc.
    
    #region Advanced - How to multi-target
    
    // The NETx symbol is active when a query runs under .NET x or later.
    
    #if NET7
    // Code that requires .NET 7 or later
    #endif
    
    #if NET6
    // Code that requires .NET 6 or later
    #endif
    
    #if NET5
    // Code that requires .NET 5 or later
    #endif
    
    #endregion
    ```
    
2.  你可以在 `MyExtensions` 靜態類別中加入以下程式碼
    
    這裡包含了 Json 與 C# 輸出的語法高亮功能：
    
    ```csharp
    public static string JsonPrettify(this string json)
    {
        using var jDoc = JsonDocument.Parse(json);
        return JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true });
    }
    
    public static string ToJsonDump(this object data) {
      return JsonPrettify(JsonSerializer.Serialize(data)).Dump();
      }
    
    public static string DumpJson(this string code, string panelTitle = null)
    {
        return DumpWithSyntaxHightlighting(JsonPrettify(code), SyntaxLanguageStyle.Json, panelTitle);
    
    }
    
    public static string DumpCSharp(this string code, string panelTitle = null)
    {
        return DumpWithSyntaxHightlighting(code, SyntaxLanguageStyle.CSharp, panelTitle);
    }
    
    public static string DumpWithSyntaxHightlighting(this string code,
        SyntaxLanguageStyle language = SyntaxLanguageStyle.XML,
        string panelTitle = null)
    {
        if (panelTitle == null)
            panelTitle = Enum.GetName(typeof(SyntaxLanguageStyle), language) + "Result";
    
        PanelManager.DisplaySyntaxColoredText(code, language, panelTitle);
        return code;
    }
    ```
    
    事實上，你可以從原始碼中看到 `SyntaxLanguageStyle` 就是用來指定語法高亮的語言樣式，支援的程式語言類型如下：
    
    ```csharp
    public enum SyntaxLanguageStyle
    {
      None,
      CSharp,
      VB,
      FSharp,
      SQL,
      ESQL,
      CSS,
      HTML,
      JavaScript,
      PowerShell,
      Python,
      XAML,
      XML,
      Json
    }
    ```
    
    程式碼應該非常簡單易懂，大家都可以自己稍微修改即可使用！👍
    

### 相關連結

-   [LINQPad: Dump with Syntax Highlighting](https://mustak.im/linqpad-dump-with-syntax-highlighting/)
-   [LINQPad Forum](https://forum.linqpad.net/)
-   [LINQPad Resources](https://www.linqpad.net/Resources.aspx)
-   [Customer Feedback for LINQPad](https://linqpad.uservoice.com/forums/18302-linqpad-feature-suggestions)
