使用顶部数组和第一个未命名对象反序列化Json

时间:2017-08-10 18:23:32

标签: c# json json-deserialization

我正在使用返回以下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提供有效的解决方案。

2 个答案:

答案 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;
        }
    }
}