0

我有一个 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; }
 }

主文件

 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"); 类似的东西?

4

4 回答 4

2

首先你的外部 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 
于 2018-07-06T20:15:48.057 回答
1

遵循结构!您的 json 不仅仅包含一个List<Category>. 反序列化时,您必须反序列化到如下类

 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。请参阅有关其工作原理的文档。

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

于 2018-07-06T20:33:45.203 回答
1

作为替代方案,您可以使用属性控制序列化,以使您的属性名称与.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);
于 2018-07-06T20:40:56.980 回答
0

从 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);
于 2018-07-06T22:38:11.027 回答