JsonConvert.SerializeObject转义反斜杠

时间:2016-12-06 13:00:02

标签: c# json web-services json.net

我一直在阅读有关此问题的大量问题,但似乎无法解决我的特定问题。

我正在从Web服务函数返回一个json字符串。

我有这些对象:

public class WebServiceInitResult
{
    public List<Activity> Activities { get; set; }
    //rest of properties left out...
}

public class Activity
{
    public string IconCode { get; set; }
    //rest of properties left out...
}

IconCode是一个fontawesome角色的字符代码,其中任何一个:

\uf0b1
\uf274
\uf185
\uf0fa
\uf0f4
\uf015

它们完全如上所示存储在数据库中。

当我设置如下httpReponse.Content时,反斜杠会被转义:

httpResponseMessage.Content = new StringContent(JsonConvert.SerializeObject(webServiceInitResult), Encoding.UTF8, "application/json");

PostMan收到的json回复是:

"activities": [
{
  "ActivityCode": 2,
  "DisplayValue": "Shopping",
  "BackgroundColour": "E74C3C",
  "IconCode": "\\uf0b1",
  "ApplicationId": 2,
  "Application": null,
  "Id": 1,
  "Active": true,
  "DateCreated": "2016-11-25T10:15:40"
},
//rest of activities
]

如您所见,IconCode反斜杠已被转义。从阅读其他问题开始,我无法自信地判断Json.NET在序列化或发送响应时是否发生这种情况。

我尝试使用ObjectContent来解决,所以我可以避免使用Json.NET,但它返回的相同!

httpResponseMessage.Content = new ObjectContent(typeof(TravelTrackerWebServiceInitResult), webServiceInitResult, new JsonMediaTypeFormatter() , "application/json");

现在我被困住了!

有没有更好的方法可以完全按照我的需要返回?应用程序使用这些字符来显示相应的图标。

额外信息: 我最初将这些值硬编码,一切似乎都运行正常:

webServiceInitResult.activities_TT = new List<Activity_TT>()
{
 new Activity() { ActivityCode = 2, BackgroundColour = "E74C3C", DisplayValue="Shopping", IconCode="\uf0b1" },
 new Activity() { ActivityCode = 3, BackgroundColour = "BF7AC5", DisplayValue="Running", IconCode="\uf274" },
 new Activity() { ActivityCode = 4, BackgroundColour = "AF7AC5", DisplayValue="Walking", IconCode="\uf185" },
 new Activity() { ActivityCode = 5, BackgroundColour = "3498DB", DisplayValue="Jogging", IconCode="\uf0fa"  },
 new Activity() { ActivityCode = 6, BackgroundColour = "2ECC71", DisplayValue="Resting", IconCode="\uf0f4" },
 new Activity() { ActivityCode = 7, BackgroundColour = "F39C12", DisplayValue="Skipping", IconCode="\uf015" }
};

感谢。

2 个答案:

答案 0 :(得分:0)

问题是在C#语言中string值“\ uf0b1”实际上是“渲染unicode字符F0B1”的占位符。当编译器/运行时评估字符串时,会将unicode字符插入其中。

这与将字符串存储在数据库“\ uf0b1”中不同,后者是实际的字符串,而不是单个字符,使用C#表示法编码时,“\\ uf0b1”。

答案 1 :(得分:0)

感谢所有评论,我能够解决这个问题。

根据建议我需要获取字符代码,例如&#34; f0b1&#34;并在保存到数据库之前转换它。因此,在我的活动控制器中,创建和编辑,我使用信息here添加了以下内容:

int code = int.Parse(activity.IconCode, System.Globalization.NumberStyles.HexNumber);
activity.Icon = char.ConvertFromUtf32(code);

所以我添加了额外的属性Icon并将代码转换为一个字符,然后将其保存到数据库中。这个字符在我的json响应中返回。