在 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# 中反序列化复杂对象

将对象序列化为 XElement 并在内存中反序列化

无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

是否可以确定在 Json.Net 中反序列化了哪些属性? [复制]

如何在 .NET 中反序列化为本地集合?