2013-04-24 29 views
2

開頭。嘗試將嵌套數組發佈到ServiceStack休息端點時出現錯誤。ServiceStack嵌套數組錯誤:KeyValueDataContractDeserializer:錯誤轉換爲類型:類型定義應以'{'

我得到的錯誤是:

KeyValueDataContractDeserializer: Error converting to type: Type definitions should start with a '{', expecting serialized type 'DeployServer', got string starting with: object Object]"

我的階級結構是這樣的:

public class DeployEnvironment 
{ 
    public string Id { get; set; } 
    public string ProjectId { get; set; } 
    public string EnvironmentName { get; set; } 
    public List<DeployServer> ServerList { get; set; } 

    public DeployEnvironment() 
    { 
     this.ServerList = new List<DeployServer>(); 
    } 
} 
public class DeployServer 
{ 
    public string Id { get; set; } 
    public string EnvironmentId { get; set; } 
    public string ServerName { get; set; } 
} 

的職位代碼非常簡單:

public object Post(DeployEnvironment environment) 
{ 
    if (string.IsNullOrEmpty(environment.Id)) 
    { 
     return _projectManager.CreateEnvironment(environment.ProjectId, environment.EnvironmentName, environment.ServerList); 
    } 
    else 
    { 
     return _projectManager.UpdateEnvironment(environment.Id, environment.ProjectId, environment.EnvironmentName, environment.ServerList); 
    } 
} 

這裏的JSON我發送,這對我來說看起來OK:

{ 
    "id": "300b1bd2-af16-47bb-a167-407ec8966167", 
    "projectId": "03b5635a-7eb8-4aeb-80e0-461f29c4488c", 
    "environmentName": "QA", 
    "serverList": [ 
    { 
     "id": "6024e867-f858-47cb-93f4-dd592adb02af", 
     "environmentId": "300b1bd2-af16-47bb-a167-407ec8966167", 
     "serverName": "Server1" 
    }, 
    { 
     "id": "efcc3a14-3d4a-4990-b106-d5a81188ee04", 
     "environmentId": "300b1bd2-af16-47bb-a167-407ec8966167", 
     "serverName": "Server2" 
    } 
    ] 
} 

事實上,這是我會從一開始拆了相同的JSON,我只是想將它張貼回來

什麼我做錯了嗎?

感謝

與HTTP請求的原始更新時間:

POST http://local-host:55052/api/project/03b5635a-7eb8-4aeb-80e0-461f29c4488c/environment?environmentName=QA&id=300b1bd2-af16-47bb-a167-407ec8966167&serverList=%5Bobject+Object%5D,%5Bobject+Object%5D HTTP/1.1 
Host: local-host:55052 
Connection: keep-alive 
Content-Length: 382 
Accept: application/json, text/plain, */* 
Origin: http://local-host:55052 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 
Content-Type: application/json;charset=UTF-8 
Referer: http://local-host:55052/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie: ltkmodal-Modal%20Signup=Thu%2C%2024%20Jan%202013%2021%3A47%3A32%20GMT; __test=1; ss-pid=uUvKs0YDGCPIHP1yhaUg; ss-id=7Oz3jNCeXDVoLaGT4+BM; __ngDebug=true; JSESSIONID=09245EF568D4507A3635664A6E8671DA; RememberMe=1180157474^2#-6059067053273955846 

{"id":"300b1bd2-af16-47bb-a167-407ec8966167","projectId":"03b5635a-7eb8-4aeb-80e0-461f29c4488c","environmentName":"QA","serverList":[{"id":"6024e867-f858-47cb-93f4-dd592adb02af","environmentId":"300b1bd2-af16-47bb-a167-407ec8966167","serverName":"Server1"},{"id":"efcc3a14-3d4a-4990-b106-d5a81188ee04","environmentId":"300b1bd2-af16-47bb-a167-407ec8966167","serverName":"Server2"}]} 

回答 感謝mythz的答案,他是對的,我是雙重張貼。問題是,我調用AngularJS資源庫保存這樣:

$scope.environment.$save($scope.environment); 

而且我一直在呼籲這樣說:

var saveParams = { 
    id: $routeParams.environmentId, 
    projectId: $routeParams.projectId 
}; 
$scope.environment.$save(saveParams); 
+0

燦你粘貼原始的HTTP請求?你可以用Fiddler或Wireshark捕捉它 – mythz 2013-04-24 21:59:06

+0

當然,補充,謝謝 – 2013-04-24 22:55:23

回答

1

你雙張貼在請求都QueryString和請求正文中。在QueryString中,當使用JSV Format解析複雜類型時。

更改URL是剛剛選定的路線,即:

/api/project/03b5635a-7eb8-4aeb-80e0-461f29c4488c/environment 

然後解析請求主體要細,如:

var json = @"{""id"":""300b1bd2-af16-47bb-a167-407ec8966167"",""projectId"":""03b5635a-7eb8-4aeb-80e0-461f29c4488c"",""environmentName"":""QA"",""serverList"":[{""id"":""6024e867-f858-47cb-93f4-dd592adb02af"",""environmentId"":""300b1bd2-af16-47bb-a167-407ec8966167"",""serverName"":""Server1""},{""id"":""efcc3a14-3d4a-4990-b106-d5a81188ee04"",""environmentId"":""300b1bd2-af16-47bb-a167-407ec8966167"",""serverName"":""Server2""}]}"; 
var dto = json.FromJson<DeployEnvironment>(); 

dto.PrintDump(); 

輸出:

/* 
{ 
    Id: 300b1bd2-af16-47bb-a167-407ec8966167, 
    ProjectId: 03b5635a-7eb8-4aeb-80e0-461f29c4488c, 
    EnvironmentName: QA, 
    ServerList: 
    [ 
     { 
      Id: 6024e867-f858-47cb-93f4-dd592adb02af, 
      EnvironmentId: 300b1bd2-af16-47bb-a167-407ec8966167, 
      ServerName: Server1 
     }, 
     { 
      Id: efcc3a14-3d4a-4990-b106-d5a81188ee04, 
      EnvironmentId: 300b1bd2-af16-47bb-a167-407ec8966167, 
      ServerName: Server2 
     } 
    ] 
} 
*/ 
+0

啊,有趣。是的,我濫用一個angularJS資源庫,這是做的伎倆,謝謝! – 2013-04-25 10:12:04