在 C# 中序列化为 JSON 并在 TS 中反序列化
Posted
技术标签:
【中文标题】在 C# 中序列化为 JSON 并在 TS 中反序列化【英文标题】:Serialize to JSON in C# and deserialize in TS 【发布时间】:2017-02-14 20:26:55 【问题描述】:我在两个应用程序之间发送数据时遇到问题。我使用以下代码在 C# 中将数据序列化为 JSON:
public static string SerializeToJson<T>(this T obj)
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, obj);
byte[] array = ms.ToArray();
return Encoding.UTF8.GetString(array, 0, array.Length);
然后我使用套接字通信将其发送到我在 TypeScript 中实现的第二个应用程序。我使用反序列化它:
JSON.parse
函数,它工作正常,但如果数据中是特殊字符,例如 8211 '-' 它会抛出异常
SyntaxError: Unexpected token in JSON at position 907
可能是序列化和反序列化编码不同的问题,但我不知道 JSON.parse 中使用了哪种编码。
谁能帮帮我?
【问题讨论】:
你能提供json导致错误的例子吗? 【参考方案1】:另一种方法是使用 Newtonsoft Json.Net(可从 nuget 获得)。 它易于使用且功能强大。
public static string SerializeToJson<T>(this T obj)
return JsonConvert.SerializeObject(obj);
你甚至可以添加一些格式或你想要的。
【讨论】:
【参考方案2】:我使用将字符串转换为 base64 来解决此问题,然后在我的第二个应用程序中对其进行解码。
【讨论】:
【参考方案3】:以下代码对我有用。以下解决方案还确保了底层对象的类型。将 C# 对象转换为 typescript 对象。
使用任何 JSON 库将您的对象转换为 json 格式。 (newtonsoft 是最推荐的)
string output = JsonConvert.SerializeObject(product); // product =new Product(); <= Product is custom class. substitute your class here
将此字符串传递给您的应用程序。 (ActionResult 或 ajax 调用)
现在在 javascript 中使用模型(Razor 或 ajax 结果)访问值
YourTSClass.ProcessResults('@Model') // using razor in js
或
.done(response => ProcessResults(response)) // using ajax success result
您不需要以这种方式应用 JSON.Parse。
在打字稿中,您可以通过像这样声明函数来获得结果。
public static ProcessResults(result: Product)...
【讨论】:
以上是关于在 C# 中序列化为 JSON 并在 TS 中反序列化的主要内容,如果未能解决你的问题,请参考以下文章
无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误
使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]