You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:27:05