2010-09-06 14 views
0

我使用DataContractJsonSerializer將對象序列化爲json,然後使用AJAX返回客戶端。我現在需要序列化另一個對象以便與它一起返回。問題是包裝JSON的MS「d」,這阻止我簡單地將字符串連接成單個JSON字符串。.NET將JSON附加到已使用DataContractJsonSerializer序列化的字符串

​​

返回:

{ 
    "d":"[{ 
     \"__type\":\"User:#HagarDB\", 
     \"ID\":1 
    }]\", 
    \"SecurityGroup\": 1" 
} 

任何建議,將不勝感激。我寧願不必再打電話到服務器來獲取其他對象。

+0

爲什麼不創建一個特殊的「視圖模型」類型的對象,它容納兩個對象?那麼你可以序列化到這一點。基本上嵌套數據合同。 – RPM1984 2010-09-06 06:40:13

回答

0

代碼中至少有兩個roblems。第一個:你使JSON序列化兩次。第二:不能將JSON字符串附加到其他數據,因爲結果字符串中的JSON格式不會更多。

如果您使用網絡方法的[ScriptMethod(ResponseFormat = ResponseFormat.Json)]屬性,則您返回的對象將自動序列化爲JSON字符串的。所以你應該不是之前手動序列化它。

如果你想要序列化的對象已經是一個字符串,那麼在序列化過程中,所有的對象都將保持不變("將被替換爲\")。在你手動對象序列化的情況下,你收到了字符串[{"__type":"User:#HagarDB", "ID":1}],這是正確的JSON字符串。要驗證這一點,您可以將該字符串粘貼到驗證程序http://www.jsonlint.com/中。有關JSON格式的更多信息,您可以在http://www.json.org/上閱讀。

如果追加與像"SecurityGroup": 1另一個字符串數據(這是不是一個JSON字符串,正確的將是{"SecurityGroup": 1})與琴絃之間的逗號,您將收到該字符串

[{"__type":"User:#HagarDB", "ID":1}], "SecurityGroup": 1 

這也是錯誤的JSON 。正確的JSON會像

{ "MyArray": [ {"__type": "User:#HagarDB", "ID": 1 } ], "SecurityGroup": 1 } 

在年底返回的字符串作爲網絡methid的結果和形式{d: result}所有配額將被轉義得到結果:

{ 
    "d": "[{\"__type\":\"User:#HagarDB\", \"ID\":1}], \"SecurityGroup\": 1" 
} 

這是一個JSON字符串,但它不是你想要的。

您的問題的解決方案非常簡單。你的網頁方法可以看起來像下面

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public MyResult MyMethod() { 
    List<Users> users = BuildMyInnerInformation(); 
    return new MyResult { Users: users, SecurityGroup: 1}; 
} 

public class MyResult { 
    public List<Users> Users { get; set; } 
    public int SecurityGroup { get; set; } 
} 
0

正如RPM1984在評論中所建議的,最好的解決方案可能是創建一個包含要序列化的對象的類。

如果由於某種原因,是不是一種選擇,那麼你可以做一些簡單的字符串操作插入新的對象:

// Find position of the ending characters }] 
var endPosition = json.IndexOf("}]"); 
// Insert the new json between the } and the ] 
var newJson = json.Substring(0, endPosition +1) + newJson + json.Substring(endPosition); 

也許你需要新的JSON前加一個逗號,也許你需要調整字符串索引,但你明白了。由於json是一種簡單的字符串格式,因此您可以將其視爲字符串。

最後一個提示非常難看,但它應該作爲一次性解決方案。

相關問題