我正在使用返回以下JSON的API:
[
{
"product": {
"id": 2,
"name": "Auto"
}
}
]
所以,我试图在C#对象中反序列化它,但没有成功。
我尝试了很多其他的stackoverflow解决方案。
以下是我的尝试:
public class DomainMessageResponse : BaseResponseMessage
{
public Example data { get; set; }
}
public class Example
{
[JsonProperty("product")]
public Product product { get; set; }
}
public class Product
{
[JsonProperty("id")]
public int id { get; set; }
[JsonProperty("name")]
public string name { get; set; }
}
问题是JSON以[]开头,我们的泛型方法(我在内部框架中使用)无法使用它。我得到以下例外:
无法将当前JSON数组(例如[1,2,3])反序列化为类型....
感谢@EZI和@eocron提供有效的解决方案。
答案 0 :(得分:1)
您应该反序列化为数组/列表。下面的代码应该有用......
var list = JsonConvert.DeserializeObject<List<Item>>(json);
public class Product
{
public int id { get; set; }
public string name { get; set; }
}
public class Item
{
public Product product { get; set; }
}
答案 1 :(得分:1)
考虑到您想要使用对象的方式,您的问题有两种解决方案。
首先,只需使用相同的字段创建 DTO 即可。在需要完全控制时使用:
using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace ConsoleTest
{
class Program
{
[DataContract]
public class Example
{
[DataMember]
public Product Product { get; set; }
}
[DataContract]
public class Product
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}
static void Main(string[] args)
{
var json = @"
[
{
""product"": {
""id"": 2,
""name"": ""Auto""
}
}
]";
var obj = JsonConvert.DeserializeObject<List<Example>>(json,
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
}
}
}
当您需要json的一些字段并且不关心其他所有字段时使用第二个,并使用动态类型。易于编码,易于使用,看起来很不错,但不是很安全:
using System.Collections.Generic;
using Newtonsoft.Json;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
var json = @"
[
{
""product"": {
""id"": 2,
""name"": ""Auto""
}
}
]";
dynamic list = JsonConvert.DeserializeObject<List<dynamic>>(json);
var id = (int)list[0].product.id;
}
}
}