servicestack,jsonobject,Parsing,Dynamic,servicestack,Jsonobject" /> servicestack,jsonobject,Parsing,Dynamic,servicestack,Jsonobject" />

Parsing 将Web API转换为Servicestack-JObject到JsonObject

Parsing 将Web API转换为Servicestack-JObject到JsonObject,parsing,dynamic,servicestack,jsonobject,Parsing,Dynamic,servicestack,Jsonobject,我正在尝试将基于Web Api的项目转换为Servicestack,现在我在将复杂(客户端)对象图转换为C#动态类时遇到了问题(因为它很复杂,主要用于客户端,我不想创建C#表示)。下面是一些精简的代码(不是精确的代码,因此可能会有错误): 旧代码: [HttpPost] public HttpResponseMessage Save([FromBody] JObject jsonData) { dynamic jsonDataAsDynamic = jsonData; var

我正在尝试将基于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是否与cast to JObject相同

我的Javascript调用是:

$.ajax({
    type: "POST",
    url: <save url>,
    data: '{' +
        '"A":' + a +
       ',"B":' + b +
       ',"TheComplexObjectGraphStringified":' + JSON.stringify(TheComplexObjectGraph) +
    '}',
    contentType: "application/json",
    dataType: "json",
$.ajax({
类型:“POST”,
网址:,
数据:“{”+
“A”:“+A”+
“,“B”:“+B”+
“,“ComplexObjectGraphString”:“+JSON.stringify(ComplexObjectGraph)+
'}',
contentType:“应用程序/json”,
数据类型:“json”,
示例数据:

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

{“zoom”:12,“tilt”:0,“overlays”:[{“uniqueid”:138727972247,“Path”:[{“lat”:52.096898776519055,“lng”:5.655044395378695},{“lat”:52.09360731580485,“lng”:5.655044395378695}],“center:{“lat”:52.095253046161574,“lng”:5.65941105494}

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

{缩放:12,倾斜:0,覆盖:

正如您所看到的,zoom不再被引用(我期待类似“{\“zoom\”:12”的内容

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


我做错了什么?

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

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

  • 这种方法的问题在于,您没有逃脱复杂对象

要解决此问题,应将数据对象字符串化:

$.ajax({
    type: "POST",
    url: <save url>,
    data: JSON.stringify({
        A: a, 
        B: b, 
        TheComplexObjectGraphStringified: JSON.stringify(TheComplexObjectGraph)
    }),
    contentType: "application/json",
    dataType: "json",
    ...
$.ajax({
类型:“POST”,
网址:,
数据:JSON.stringify({
A:A,
B:B,
complexObjectGraphString:JSON.stringify(complexObjectGraph)
}),
contentType:“应用程序/json”,
数据类型:“json”,
...
我强烈建议您避免手动编写JSON字符串

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

是的,没有理由给出有效代码,
JsonObject.Parse
不起作用

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

是的,它的行为类似。您可以看到的示例。其中的示例还包括谷歌地图数据示例。它可能很有用


希望这有帮助。

非常感谢,考虑到我的非stringify解决方案,我觉得自己是新手。它现在可以工作了!提供的链接非常有用。