2012-11-30 45 views
2

我使用JSON.NET反序列化從瀏覽器發送的AJAX HTTP請求,並且遇到了使用Guid []作爲參數的Web服務調用的問題。當我使用內置的.NET序列化器時,這工作得很好。反序列化GUID數組時JSON.NET異常

首先,在流看上去像這樣的原始字節:

System.Text.Encoding.UTF8.GetString(rawBody); 
"{\"recipeIds\":[\"d9ede305-d244-483b-a435-abcf350efdb2\"]}" 

然後我打電話:

Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); 
parameters[0] = serializer.Deserialize(sr, operation.Messages[0].Body.Parts[0].Type); 

.TypeSystem.Guid[]

然後我得到異常:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Guid[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. 

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. 

Path 'recipeIds', line 1, position 13. 

接受單個Guid(而非數組)工作的Web服務方法,所以我知道JSON.NET能夠將字符串轉換爲GUID,但是當您擁有一組您想要的字符串數組時,它似乎會炸燬將其反序列化爲一個GUID數組。

這是一個JSON.NET的錯誤,有沒有辦法解決這個問題?我想我可以寫我自己的自定義Guid集合類型,但我寧願不。

回答

4

您需要的包裝類

string json = "{\"recipeIds\":[\"d9ede305-d244-483b-a435-abcf350efdb2\"]}"; 
var obj = JsonConvert.DeserializeObject<Wrapper>(json); 


public class Wrapper 
{ 
    public Guid[] recipeIds; 
} 

- 編輯 -

使用LINQ

var obj = (JObject)JsonConvert.DeserializeObject(json); 

var guids = obj["recipeIds"].Children() 
      .Cast<JValue>() 
      .Select(x => Guid.Parse(x.ToString())) 
      .ToList(); 
+0

所以那麼這是一個JSON.NET錯誤。 –

+0

@MikeChristensen不,請參閱您的json中的recipeIds。你得到一個包含Guid數組的屬性'recipeIds'的對象。 –

+0

你說得對。這個序列化程序實際上工作正常,它是這個WCF格式化程序的JSON.NET有bug。我需要重新工作一些邏輯。 –