2013-12-17 2 views
2

Я пытаюсь преобразовать проект на основе Web Api в Servicestack, и теперь у меня возникла проблема при преобразовании сложного (клиентского) графа объектов объекта в динамический класс C# (поскольку это сложная и в основном используемая клиентская сторона, я не хочу создавать представление C# этого). Вот некоторые раздели код (не точный код, так что может быть ошибки):Преобразование Web API в Servicestack - JObject to JsonObject

СТАРЫЙ КОД:

[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.

вызов

Мой браузер:

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

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

После применения stringify с яваскрипта содержания (НА КЛИЕНТА) из 'TheComplexObjectGraphStringified' является (для интереса это данные Google):

{"zoom": 12, "tilt": 0, "overlays": [{"uniqueid": 1387287972247, "paths": [[{lat ": 52.096898776519055," lng ": 5.655044395378695}, { "латы": +52,093607315804085, "LNG": 5,655044395378695}]]}], "центр": { "латы": 52,095253046161574, "LNG": +5,6594110316549 4}}

Теперь странно, когда это прибывает на сервер в свойстве «TheComplexObjectGraphStringified», кавычки удаляются! Отладчик данные:

«{зум: 12, наклон: 0, накладываемые: < ... остальные строки ...>»

Как вы можете видеть увеличение не котируется какой-то более (я ожидал что-то как «{\» зумирования \ «: 12»

Я заметил, если добавить некоторые кавычки экранированы вручную с помощью отладчика JsonObject.Parse, кажется, работает

Что я делаю неправильно

ответ

2

Ваш.? проблемы возникают, потому что вы не правильно сериализуете свои данные, прежде чем поступает на сервер ServiceStack.

  • В своем коде вы строковые сложные данные, но затем вручную пытались строить данные в формате JSON, окружающий объект, перед отправкой его на сервер.

  • Проблема с этим подходом заключается в том, что вы не избежали сложного объекта.

Чтобы исправить эту проблему, вы должны stringify объект данных:

$.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's support for dynamic JSON here. В примерах есть пример данных Google Maps. Это может быть полезно.

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

+1

Огромное спасибо, и я чувствую себя как greenhorn, рассматривая мое решение, не связанное с натяжением. Он работает сейчас! И прилагаемая ссылка действительно полезна. – Stackbever

+0

@Stackbever Awesome рад, что это сработало. – Scott

Смежные вопросы