Преобразование веб-API в сервисный стек — JObject в JsonObject

Я пытаюсь преобразовать свой проект на основе веб-API в Servicestack, и теперь у меня возникла проблема при преобразовании сложного (клиентского) графа объектов в динамический класс С# (поскольку он сложный и в основном используется на стороне клиента, я не хочу создавать представление этого 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",

Пример данных:

После применения stringify с javascript содержимое (НА КЛИЕНТЕ) «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, похоже, это сработает.

Что я делаю не так?


person Stackbever    schedule 17.12.2013    source источник


Ответы (1)


Ваши проблемы возникают из-за того, что вы неправильно сериализуете свои данные до того, как они поступят на сервер 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.

Да ведет себя аналогично. Примеры поддержки динамического JSON в ServiceStack.Text можно посмотреть здесь. Приведенные здесь примеры также включают пример данных Google Maps. Это может быть полезно.

Надеюсь это поможет.

person Scott    schedule 18.12.2013
comment
Большое спасибо, и я чувствую себя новичком, учитывая мое решение без строк. Теперь это работает! А предоставленная ссылка действительно полезна. - person Stackbever; 18.12.2013