【问题标题】:Converting json to c# object将json转换为c#对象
【发布时间】:2018-07-06 20:10:50
【问题描述】:

我有一个 api,它返回一个包含数据转换信息的 json 和一个包含数据的数组

{
    "code": "200",
    "result": true,
    "message": "",
    "data": {
        "item": [
            {
                "id": "5",
                "descricao": "TesteDesc",
                "observacao": "TesteObs",
                "status": "1"
            },
            {
                "id": "7",
                "descricao": "TesteDesc",
                "observacao": "TesteObs",
                "status": "1"
            },
        ],
        "count": 2
    }
}

我有一个类是指物品的返回

class Category
 {
     public int Id { get; set; }
     public string Descricao { get; set; }
     public int Status { get; set; }
     public string Observacao { get; set; }
 }

Main.cs

 var stringJson = await response.Content.ReadAsStringAsync();

我的字符串 stringJson 得到以下值

"\r\n\r\n{\"code\":\"200\",\"result\":true,\"message\":\"\",\"data\":{\"item\":[{\"id\":\"5\",\"descricao\":\"TesteDesc\",\"observacao\":\"TesteObs\",\"status\":\"1\"}],\"count\":2}}"

但是当我尝试转换时

var Data = JsonConvert.DeserializeObject<IEnumerable<Category>>(stringJson);

显示错误

错误:无法反序列化当前的 json 对象(例如 {"name":"value"}) 转换成类型 ...

如何使用 json 数据创建对象数组? 只取日期和项目

我是否可以单独正式检索值,例如我创建一个变量 bool status = jsonConvert.get ("status");类似的东西?

【问题讨论】:

    标签: c# asp.net jsonconverter


    【解决方案1】:

    首先你的外部 JSON 格式是一个对象,而不是一个数组。

    你的模特会喜欢这个的。

    public class Item
    {
        public string id { get; set; }
        public string descricao { get; set; }
        public string observacao { get; set; }
        public string status { get; set; }
    }
    
    public class Data
    {
        public List<Item> item { get; set; }
        public int count { get; set; }
    }
    
    public class Category
    {
        public string code { get; set; }
        public bool result { get; set; }
        public string message { get; set; }
        public Data data { get; set; }
    }
    

    反序列化json

    var Data = JsonConvert.DeserializeObject<Category>(stringJson);
    List<Item> items = Data.data.item;
    //items get info from items 
    

    【讨论】:

      【解决方案2】:

      遵循结构!您的 json 不仅仅包含 List&lt;Category&gt;。反序列化时,您必须将其反序列化为如下类

       class Wrapper {
            public string code {get;set;}
            public bool result {get;set;}
            public string message {get;set;}
            public Data data {get; set;}
        }
      
      
       class Data {
            public List<Category> item {get;set;}
            public int count {get; set;}
       }
      

      然后你可以使用反序列化

       Wrapper d = JsonConvert.DeserializeObject<Wrapper>(stringJson);
      

      并使用

      访问您的项目
      d.data.item
      

      跟随外壳!在您的 json 中,所有属性都以小写字母开头,而在您的 Category 类中它们是大写的。或者,您可以定义一个忽略大小写的contractresolver。请参阅文档了解其工作原理。

      关注类型!在您的 json 中 idstatus 是字符串,在您的 Category 类中它们是整数。您也可以使用合约解析器来解决这个问题。有关详细信息,请参阅文档。

      【讨论】:

        【解决方案3】:

        作为替代方案,您可以使用属性控制序列化,以使您的属性名称与general naming conventions used in the .NET Framework 保持一致:

        public class Item
        {
            [JsonProperty("id")]
            public string Id { get; set; }
        
            [JsonProperty("descricao")]
            public string Descricao { get; set; }
        
            [JsonProperty("observacao")]
            public string Observacao { get; set; }
        
            [JsonProperty("status")]
            public string Status { get; set; }
        }
        
        public class Data
        {
            [JsonProperty("item")]
            public List<Item> Items { get; set; }
        
            [JsonProperty("count")]
            public int Count { get; set; }
        }
        
        public class Response
        {
            [JsonProperty("code")]
            public string Code { get; set; }
        
            [JsonProperty("result")]
            public bool Result { get; set; }
        
            [JsonProperty("message")]
            public string Message { get; set; }
        
            [JsonProperty("data")]
            public Data Items { get; set; }
        }
        

        反序列化json字符串的代码:

        string json = @"{
            ""code"": ""200"",
            ""result"": true,
            ""message"": ""some message"",
            ""data"": {
                ""item"": [
                    {
                        ""id"": ""5"",
                        ""descricao"": ""TesteDesc"",
                        ""observacao"": ""TesteObs"",
                        ""status"": ""1""
                    },
                    {
                        ""id"": ""7"",
                        ""descricao"": ""TesteDesc"",
                        ""observacao"": ""TesteObs"",
                        ""status"": ""1""
                    },
                ],
                ""count"": 2
            }
        }";
        
        Response response = JsonConvert.DeserializeObject<Response>(json);
        

        【讨论】:

          【解决方案4】:

          从 Nuget 安装 Newtonsoft.Json 然后试用

          string JsonData = "\r\n\r\n{\"code\":\"200\",\"result\":true,\"message\":\"\",\"data\":{\"item\":[{\"id\":\"5\",\"descricao\":\"TesteDesc\",\"observacao\":\"TesteObs\",\"status\":\"1\"}],\"count\":2}}";
          JObject jobject = (JObject)JsonConvert.DeserializeObject(JsonData);
          

          【讨论】:

            猜你喜欢
            • 2016-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-27
            • 2013-11-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多