读取webapi的json转换为实体类的问题

qq_29091637 2015-06-16 10:55:24
读取WebApi的返回值,转换成实体类报错,不知道哪里写错了
WebApi服务器端代码:
public class TestController : ApiController
{

// GET api/values
public string Get()
{
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Sizes = new string[] { "Small" };

return JsonConvert.SerializeObject(product);
}

//实体类
public class Product
{
public string Name { get; set; }
public DateTime Expiry;
public string[] Sizes;
}
}

本地客户端代码:
class Program
{
static void Main(string[] args)
{
Invoke();
Console.Read();
}

private static async void Invoke()
{
HttpClient client = new HttpClient();
var json = await client.GetStringAsync("http://localhost/WebServerApi/WebApi/api/Test");
var o = JsonConvert.DeserializeObject<Product>(json);//这里报错

Console.WriteLine(o.Name);
}
}

//实体类
public class Product
{
public string Name { get; set; }
public DateTime Expiry;
public string[] Sizes;
}

报错信息:


调用后返回的json字符串(为啥返回的是有引号和转意字符的):
"{\"Expiry\":\"2008-12-28T00:00:00\",\"Sizes\":[\"Small\"],\"Name\":\"Apple\"}"
正常的json字符串:
{"Expiry":"2008-12-28T00:00:00","Sizes":["Small"],"Name":"Apple"}

到底哪里弄错了,新手求助!!
...全文
867 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-07-06
  • 打赏
  • 举报
回复
1.2008-12-28T00:00:00这东西明显转不成时间类型,需要自己额外处理那个"T",所以必须先用字符串来接 2.带转义符是因为你debug断点调试看的.你输出到Console.WriteLine();或者TextBox或者txt文件,转义符就不见了 3.都去掉当然报错,数量都不对应了,能反序列化才怪
getti66 2015-07-06
  • 打赏
  • 举报
回复
把你的Get方法改成返回对象List,返回string 应该有点问题。
showjim 2015-06-17
  • 打赏
  • 举报
回复
有个问题,你的API返回的怎么是字符串,而不是对象?你可能需要先解决引号的问题。然后试试fastCSharp
var o = fastCSharp.emit.jsonParser.Parse<Product>(json);
  • 打赏
  • 举报
回复
删了当然不行了,可以多,但不可以少……
qq_29091637 2015-06-17
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
public class Product
        {
            public string Name { get; set; }
            public string Expiry { get; set; }
            public List<string> Sizes { get; set; }
        }
不是的,主要我把Expiry 和Sizes 删了也没用
  • 打赏
  • 举报
回复
public class Product
        {
            public string Name { get; set; }
            public string Expiry { get; set; }
            public List<string> Sizes { get; set; }
        }
  • 打赏
  • 举报
回复
昨天都没发现,你要设置属性,不是字段,为啥第一个是属性,后面两个都是字段呢……
qq_29091637 2015-06-17
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
public class Product
        {
            public string Name { get; set; }
            public string Expiry;
            public string[] Sizes;
        }
改成这样就可以反序列化了,至于为啥有转义符,因为你这个字符串外面还有双引号在包着
我把Product类里的public string Expiry; public string[] Sizes;都去掉,只保留单纯的string类型的Name,还是报同样的错,麻烦帮我再看一眼啦!
  • 打赏
  • 举报
回复
单个的反序列化难道跟js一样需要前后加 花括号? "("+jsonStr+")"试试呢
qq_29091637 2015-06-17
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
删了当然不行了,可以多,但不可以少……
两边都删了,也就是说Api返回的pruduct类只有一个Name字段 //实体类 public class Product { public string Name { get; set; } } / /ApiGET api/values public string Get() { Product product = new Product(); product.Name = "Apple"; return JsonConvert.SerializeObject(product); } 求解决
  • 打赏
  • 举报
回复
public class Product
        {
            public string Name { get; set; }
            public string Expiry;
            public string[] Sizes;
        }
改成这样就可以反序列化了,至于为啥有转义符,因为你这个字符串外面还有双引号在包着
  • 打赏
  • 举报
回复
api返回的Expiry是个字符串,不是DateTime

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧