2015-10-05 148 views
1

我有以下的JSON:反序列化JSON在C#中使用Newtonsoft

[ 
    { 
     "name": "codeURL", 
     "value": "abcd" 
    }, 
    { 
     "name": "authURL", 
     "value": "fghi" 
    } 
] 

我创建了以下对象:

public class ConfigUrlModel { 
    [JsonProperty("name")] 
    public abstract string name { get; set; } 
    [JsonProperty("value")] 
    public abstract string value { get; set; } 
} 

public class ConfigUrlsModel { 
    [JsonProperty] 
    public List<ConfigUrlModel> ConfigUrls { get; set; } 
} 

我有以下行反序列化:

resultObject = Newtonsoft.Json.JsonConvert.DeserializeObject<ConfigUrlsModel>(resultString); 
ConfigUrlsModel result = resultObject as ConfigUrlsModel; 

我收到以下错误:

Exception JsonSerializationException with no inner exception: Cannot deserialize JSON array into type 'Microsoft.Xbox.Samples.Video.Services.Jtv.Models.ConfigUrl.ConfigUrlsModel'. 
Exception JsonSerializationException with no inner exception: Cannot deserialize JSON array into type 'Microsoft.Xbox.Samples.Video.Services.Jtv.Models.ConfigUrl.ConfigUrlsModel'. 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(Type objectType, JsonContract contract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contr at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(Type objectType, JsonContract contract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contrNavigationService:OnNavigateToMessage PageSourceUri=/Microsoft.Xbox.Sample.UI;component/ErrorPrompt/ErrorPromptView.xaml 

我在做什么错?我该如何解决?

+0

其中是JtvConfigUrlsModel ?? – 2015-10-05 07:32:28

+0

@PranavPatel Jtv是一个错误。它是ConfigUrlsModel。 – khateeb

回答

5

JSON容器是一个数组,而不是一个对象,所以反序列化正是如此:

var configUrls = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ConfigUrlModel>>(resultString); 
var result = new ConfigUrlsModel { ConfigUrls = configUrls }; // If you still need the root object. 

JSON数组是值[value1, value2, ..., value]的有序列表,这是在你的问题中。 Json.NET will convert .NET arrays and collections to JSON arrays,所以你需要反序列化到一个集合类型。

2

您要发送的JSON是一个数组,但您试图将其反序列化为一个对象。醚改变你的JSON所以它在顶层的对象确定指标相匹配,并具有匹配的属性,就像这样:

{ 
    "ConfigUrls":[ 
     { 
     "name":"codeURL", 
     "value":"abcd" 
     }, 
     { 
     "name":"authURL", 
     "value":"fghi" 
     } 
    ] 
} 

或更改反序列化调用:

var urls = DeserializeObject<List<ConfigUrlModel>>(json); 

这将返回一个List<ConfigUrlModel>您可以直接使用它,也可以在需要时包装在ConfigUrlModels实例中。

此外,可以通过创建一个custom newtonsoft JsonConverter sublcass将此JSON直接反序列化到所需的类。但是这会让代码不那么清晰,所以尽可能避免使用它。

相关问题