技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

C#清理JSON字符串里的HTML標(biāo)簽和雙引號(hào)

作者:admin    時(shí)間:2023-6-12 18:57:46    瀏覽:

在獲得JSON作為響應(yīng)內(nèi)容的時(shí)候,我們不能保證字符串符合JSON語法規(guī)則,因此需要做一些額外的工作,過濾特殊符號(hào),清理不合要求的字符。在本文中,我將介紹C#如何清理JSON字符串里的HTML標(biāo)簽,同時(shí)把雙引號(hào)變?yōu)閱我?hào),以符合JSON字符串的語法規(guī)則。

例如下面是我們得到的 JSON 字符串響應(yīng)。

{
"Link": "<a href="http: //www.howtostagehomes.com/">卡卡測(cè)速網(wǎng)</a>",
    "name": "<p>卡卡測(cè)速網(wǎng)</p>",
    "Description":"這里是"卡卡測(cè)速網(wǎng)",為廣大網(wǎng)民提供網(wǎng)站速度測(cè)試服務(wù)。",
"host": "webkaka",
}

在這里,這個(gè) JSON 包含 JSON 中的 HTML 代碼和描述部分中的雙引號(hào)。為了解決這個(gè)問題,我嘗試過httputility.HTMLDecode(“<any string>”),但是,它不起作用。因此,讓我使用了以下函數(shù),該函數(shù)適用于我的解決方案以獲取 JSON 對(duì)象。

private static string HtmlToPlainText(string JsonString) {
    const string tagWhiteSpace = @ "(>|$)(\W|\n|\r)+<";
    const string stripFormatting = @ "<[^>]*(>|$)";
    const string lineBreak = @ "<(br|BR)\s{0,1}\/{0,1}>";
    var lineBreakRegex = new Regex(lineBreak, RegexOptions.Multiline);
    var stripFormattingRegex = new Regex(stripFormatting, RegexOptions.Multiline);
    var tagWhiteSpaceRegex = new Regex(tagWhiteSpace, RegexOptions.Multiline);
    var text = JsonString;
    text = System.Net.WebUtility.HtmlDecode(text);
    text = tagWhiteSpaceRegex.Replace(text, "><");
    text = lineBreakRegex.Replace(text, Environment.NewLine);
    text = stripFormattingRegex.Replace(text, string.Empty);
    return text;
}

在上面的函數(shù)中,我們先簡(jiǎn)單地檢查代碼。

  • 第一行將匹配角括號(hào)之間的空白和換行符。
  • 第二行將匹配尖括號(hào)之間的標(biāo)簽,即使缺少結(jié)束標(biāo)簽。
  • 第三行將匹配換行符標(biāo)記。
  • 下面的第 5 行到第 7 行將創(chuàng)建上述行的正則表達(dá)式。
  • 下面的第 10 行到第 13 行將匹配 JSON 字符串并刪除 HTML 內(nèi)容,并提供干凈的 JSON 字符串。

上面的函數(shù)將返回干凈的 JSON 字符串作為響應(yīng)并刪除 HTML 代碼。執(zhí)行上述功能后的響應(yīng)如下。

{
    "Link": "卡卡測(cè)速網(wǎng)",
    "name": "卡卡測(cè)速網(wǎng)",
    "Description":"這里是"卡卡測(cè)速網(wǎng)",為廣大網(wǎng)民提供網(wǎng)站速度測(cè)試服務(wù)。",
    "host": "webkaka",
}

現(xiàn)在,你可以觀察上面的 JSON,你仍然可以檢查 JSON 對(duì)象的值部分是否有多個(gè)雙引號(hào)?,F(xiàn)在,讓我們檢查以下函數(shù)和模型,它為我們提供了最終的干凈 JSON 對(duì)象。

public class CSharpProfile {
    public string Link {
        get;
        set;
    }
    public string name {
        get;
        set;
    }
    public string Description {
        get;
        set;
    }
    public string host {
        get;
        set;
    }
}
private static CSharpProfile DeserializeJson(string jsonString) {
    var loop = true;
    do {
        try {
            var m = JsonConvert.DeserializeObject < CSharpProfile > (jsonString);
            loop = false;
        } catch (JsonReaderException ex) {
            var position = ex.LinePosition;
            var invalidChar = jsonString.Substring(position - 2, 2);
            invalidChar = invalidChar.Replace("\"", "'");
            jsonString = $ "{jsonString.Substring(0, position - 1)}{invalidChar}  {
                jsonString.Substring(position)
            }
            ";
        }
    } while (loop);
    return JsonConvert.DeserializeObject < CSharpProfile > (jsonString);
}

現(xiàn)在,在上面的代碼中,如果你檢查我已經(jīng)創(chuàng)建了一個(gè)簡(jiǎn)單的模型和函數(shù),它將 JSON 作為具有多個(gè)雙引號(hào)的字符串。因此,讓我們簡(jiǎn)單地分步了解。

  • 首先,我進(jìn)行了一個(gè)循環(huán),我們知道如果我們要反序列化沒有正確 JSON 對(duì)象的字符串,那么它將生成異常。
  • 在這里,我們知道問題出在空間上,所以我嘗試反序列化它,并在異常生成時(shí)獲取了生成異常的當(dāng)前行。
  • 在當(dāng)前行號(hào)的基礎(chǔ)上,我取前一個(gè)字符并將雙引號(hào)替換為單引號(hào)。
  • 這將循環(huán)直到反序列化成功。

以下是“DeserializeJson”函數(shù)成功后JSON對(duì)象的最終輸出。

{
"Link": "卡卡測(cè)速網(wǎng)",
"name": "卡卡測(cè)速網(wǎng)",
"Description": "這里是'卡卡測(cè)速網(wǎng)',為廣大網(wǎng)民提供網(wǎng)站速度測(cè)試服務(wù)。",
"host": "webkaka"
}

這是一個(gè)有效的 JSON 對(duì)象。

我在文中創(chuàng)建了兩個(gè)不同的函數(shù),以便在我們需要時(shí)重用,希望對(duì)大家有所幫助。

相關(guān)文章

標(biāo)簽: CSharp  JSON  JSON字符串  
x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */