PowerShell处理含HTML字符串的JSON时转换异常求助
解决PowerShell处理含HTML的JSON时HTML变形的问题
我太懂这种头疼的情况了——用PowerShell操作带HTML内容的JSON文件,转存回去后HTML居然变样了,明明没碰这部分内容却面目全非。这其实是PowerShell内置的ConvertFrom-Json和ConvertTo-Json默认行为导致的:解析JSON时它会自动解码HTML里的转义实体(比如把"变成"),重新序列化时又会把这些字符转义,最终打乱了原始HTML结构。
下面给你两个可靠的解决方案,按需选择:
方案一:用Newtonsoft.Json处理(强烈推荐)
Newtonsoft.Json(也就是大家常说的Json.NET)是.NET生态里最成熟的JSON处理库,能精准控制序列化/反序列化的细节,完美保留HTML的原始格式。
- 先安装模块(如果还没装):
Install-Module -Name Newtonsoft.Json -Scope CurrentUser
- 读取、修改、保存JSON的完整代码:
# 读取你的JSON文件内容 $jsonContent = Get-Content -Path "your-target-file.json" -Raw # 用Newtonsoft.Json反序列化为PowerShell对象 $jsonObject = [Newtonsoft.Json.JsonConvert]::DeserializeObject($jsonContent) # 在这里执行你需要的操作,比如修改count值、更新其他字段 $jsonObject.count = 2 $jsonObject.value[0].id = 3 # 重新序列化为JSON,严格保留HTML格式 $updatedJson = [Newtonsoft.Json.JsonConvert]::SerializeObject($jsonObject, [Newtonsoft.Json.Formatting]::Indented) # 保存回文件 $updatedJson | Set-Content -Path "updated-file.json" -Encoding UTF8
这个方法会原封不动保留HTML里的所有转义实体和格式,绝对不会出现变形问题。
方案二:调整PowerShell内置工具的操作逻辑
如果不想额外安装模块,也可以通过“提取原始HTML+替换回去”的方式绕开内置工具的缺陷,适合JSON结构固定的场景:
# 读取原始JSON的完整内容 $rawJson = Get-Content -Path "your-target-file.json" -Raw # 用正则提取出原始的HTML内容(针对你提供的JSON结构) $htmlMatch = [regex]::Match($rawJson, '"System.Description":\s*"([^"]+)"') $originalHtml = $htmlMatch.Groups[1].Value # 把JSON转成PowerShell对象进行你需要的操作 $jsonObject = $rawJson | ConvertFrom-Json # 示例操作:新增一个字段 $jsonObject.value[0].fields.Add("NewField", "NewValue") # 先临时序列化对象,再把原始HTML替换回去 $tempJson = $jsonObject | ConvertTo-Json -Depth 10 $updatedJson = $tempJson -replace '"System.Description":\s*"([^"]+)"', "`"System.Description`": `"$originalHtml`"" # 保存最终的JSON文件 $updatedJson | Set-Content -Path "updated-file.json" -Encoding UTF8
这个思路是先把原始HTML“备份”出来,等处理完其他字段后再替换回去,避免内置工具修改HTML内容。
补充:问题根源再解释下
PowerShell内置的JSON cmdlet是为通用场景设计的,它会自动处理字符串中的转义序列和HTML实体。比如你的HTML里的"会被解析成",而重新序列化时,这个"又会被转成\",一来一回就破坏了原始HTML的结构——这就是你看到HTML改变的原因。
内容的提问来源于stack exchange,提问作者art-a-game
相关产品推荐
相关产品推荐

