2

我正在尝试将基于 Web Api 的项目转换为 Servicestack,现在在将复杂(客户端)侧对象图转换为 C# 动态类时遇到问题(因为它很复杂并且主要用于客户端我不想创建对此的 C# 表示)。这是一些剥离的代码(不是确切的代码,因此可能存在错误):

旧代码:

[HttpPost]
public HttpResponseMessage Save([FromBody] JObject jsonData)
{

    dynamic jsonDataAsDynamic = jsonData;
    var test = (JObject)jsonDataAsDynamic.TheComplexObjectGraphStringified; 
}

上面的代码可以正常工作。

新代码:

[Route("/SomeRoute/Save")]
public class PostRequest
{
    public string A { get; set; }
    public string B { get; set; }
    public string TheComplexObjectGraphStringified { get; set; }
}

public object Post(PostRequest request)
{
    var test = JsonObject.Parse(request.TheComplexObjectGraphStringified);

}

注意:因为我是 Servicestack 的新手,所以我(还)不知道 JsonObject.Parse 是否与对 JObject 的强制转换相同。

我的 Javascript 调用是:

$.ajax({
    type: "POST",
    url: <save url>,
    data: '{' +
        '"A":' + a +
       ',"B":' + b +
       ',"TheComplexObjectGraphStringified":' + JSON.stringify(TheComplexObjectGraph) +
    '}',
    contentType: "application/json",
    dataType: "json",

示例数据:

在使用 javascript 应用 stringify 后,“TheComplexObjectGraphStringified”的内容(在客户端上)是(为了您的兴趣,它是 Google 数据):

{"zoom":12,"tilt":0,"overlays":[{"uniqueid":1387287972247, "paths":[[{"lat":52.096898776519055,"lng":5.655044395378695},{"lat": 52.093607315804085,"lng":5.655044395378695}]]}],"center":{"lat":52.095253046161574,"lng":5.65941103165494}}

现在奇怪的是,当它到达服务器上的属性“TheComplexObjectGraphStringified”时,引号被删除了!调试器数据:

“{zoom:12,tilt:0,overlays: <...其余字符串...>”

如您所见,缩放不再被引用(我期待像 "{\"zoom\": 12"

我注意到如果我使用调试器 JsonObject.Parse 手动添加一些转义引号似乎可以工作。

我究竟做错了什么?

4

1 回答 1

2

您的问题正在发生,因为您没有在数据到达 ServiceStack 服务器之前正确序列化数据。

  • 在您的代码中,您已经对复杂数据进行了字符串化,但随后手动尝试构建对象周围的 JSON 数据,然后再将其发送到服务器。

  • 这种方法的问题是你没有逃脱复杂的对象。

要解决此问题,您应该对数据对象进行字符串化:

$.ajax({
    type: "POST",
    url: <save url>,
    data: JSON.stringify({
        A: a, 
        B: b, 
        TheComplexObjectGraphStringified: JSON.stringify(TheComplexObjectGraph)
    }),
    contentType: "application/json",
    dataType: "json",
    ...

我强烈建议您避免手动编写 JSON 字符串。

我注意到如果我使用调试器 JsonObject.Parse 手动添加一些转义引号似乎可以工作。

是的,没有理由给出JsonObject.Parse不应该工作的有效代码。

我(还)不知道 JsonObject.Parse 是否与对 JObject 的强制转换相同。

是的,它的行为类似。您可以在此处查看 ServiceStack.Text 对动态 JSON 的支持示例。那里的示例也包括 Google Maps 数据示例。它可能有用。

希望这可以帮助。

于 2013-12-18T09:00:11.747 回答