C#如何反序列化iOS内购返回的非JSON格式JavaScript字符串
解决方案
格式本质说明
你解码得到的非标准JSON结构是Apple ASCII格式PLIST(属性列表),是苹果旧版内购回执的官方标准格式,无需手动硬替换字符适配。
方案1:使用专业PLIST解析库(最规范,推荐)
.NET生态有成熟的PLIST解析库,原生支持ASCII/二进制两种plist格式,完全规避字符替换可能导致的解析错误:
- 首先通过NuGet安装
PListNet包 - 解析示例代码:
using PListNet; using PListNet.Nodes; using Newtonsoft.Json; // 解码PurchaseToken byte[] tokenBytes = Convert.FromBase64String(yourPurchaseToken); // 直接解析PLIST using var ms = new MemoryStream(tokenBytes); var rootDict = (DictionaryNode)PList.Load(ms); // 方式1:直接取值 string signature = rootDict["signature"].ToString(); string purchaseInfoBase64 = rootDict["purchase-info"].ToString(); // 解析purchase-info(同样是Base64编码的PLIST) byte[] purchaseInfoBytes = Convert.FromBase64String(purchaseInfoBase64); using var infoMs = new MemoryStream(purchaseInfoBytes); var purchaseInfoDict = (DictionaryNode)PList.Load(infoMs); // 方式2:转换为标准JSON再反序列化到自定义类 string json = JsonConvert.SerializeObject(rootDict); var purchaseTokenObj = JsonConvert.DeserializeObject<YourPurchaseTokenModel>(json);
方案2:正则标准化转换(无第三方依赖)
如果不想引入额外依赖,可以用精准正则完成格式转换,不会误改值内的=/;字符:
using System.Text.RegularExpressions; using Newtonsoft.Json; // Base64解码得到原始PLIST字符串 byte[] tokenBytes = Convert.FromBase64String(yourPurchaseToken); string plistStr = Encoding.UTF8.GetString(tokenBytes); // 精准替换分隔符:把键值对的 " = " 替换为 ": " string normalizedJson = Regex.Replace(plistStr, @"\""\s*=\s*\""", @""": """); // 替换行尾的 "; 为 ", normalizedJson = Regex.Replace(normalizedJson, @""";\s*$", @""",", RegexOptions.Multiline); // 去掉最后一个键值对尾部多余的逗号 normalizedJson = Regex.Replace(normalizedJson, @",\s*}", "}"); // 直接反序列化 var result = JsonConvert.DeserializeObject<YourPurchaseTokenModel>(normalizedJson);
内容的提问来源于stack exchange,提问作者AbhiAbzs
相关产品推荐
相关产品推荐

