【问题标题】:WebApi Newtonsoft.Json.JsonConvert.DeserializeObject <Class> ErrorWebApi Newtonsoft.Json.JsonConvert.DeserializeObject <Class> 错误
【发布时间】:2016-01-31 01:23:55
【问题描述】:

我在 Visual Studio 2013 中做一个 WebApi 方法,我想反序列化一个类类型。我的班级是这样的

[JsonObject]
    class JOTA
    {
        [JsonProperty("ProductId")]
        public int ProductId { get; set; }
        [JsonProperty("Name")]
        public string Name { get; set; }
    }

我的电话是这样的。

 public void ReturnListProd(JOTA PP)
 {
 JOTA product = Newtonsoft.Json.JsonConvert.DeserializeObject<JOTA>(PP);
 }

我有一个编译错误

'Network.Json.Json.Converter[] has some invalid argument'

但是,如果定义一个 ArrayList

public void ReturnListProd(ArrayList PP)
{
JOTA product = Newtonsoft.Json.JsonConvert.DeserializeObject<JOTA>(PP[0].ToString());
}

我没有错误。但在这种情况下,它对我需要的东西没有帮助。

我错过了什么? 谢谢

【问题讨论】:

  • 第一个例子没有意义,为什么要取JOTA 对象(不是序列化版本)并再次将其反序列化为 JOTA 对象?在这种情况下,你的方法体只是JOTA product = PP; 另外,为什么你的方法返回void,你只是把结果扔掉了?第二个示例不是编译时错误,但我敢打赌它会是运行时错误。
  • DeserializeObject 方法将string 作为参数,但您给它的是JOTA 对象。该错误会告诉您确切的问题所在。

标签: c# class arraylist asp.net-web-api json-deserialization


【解决方案1】:

如果您希望 JOTA 对象成为其自身的字符串表示形式(对其进行序列化),那么您应该使用

string serialized = Newtonsoft.Json.JsonConvert.SerializeObject(PP);

如果您希望字符串成为 JOTA 对象,那么您正在使用

JOTA product = Newtonsoft.Json.JsonConvert.DeserializeObject<JOTA>(serialized);

问题是您试图反序列化一个未序列化(已经反序列化)的对象。

【讨论】:

    【解决方案2】:

    如果属性名称不同,则不需要属性。

    public class JOTA
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
    }
    
    public void ReturnListProd(JOTA PP)
    {
       var product = PP; //not really needed you can just use PP directly
    }
    

    只有在接收到 json 字符串时才需要反序列化。因为您使用的是 WebAPI,所以我建议您将 API 端点更改为适当的 REST 端点。示例:

    [HttpPost, Route("api/products/add")]
    public IHttpActionResult ReturnListProd([FromBody]JOTA PP)
    {
        try
        {
            //do something with passed in data
            var name = PP.Name;
    
            //always at minimum return a status code
            return Ok();
        }
        catch
        {
            //returns 500
            return InternalServerError();
        }
    }
    

    然后将您的 ajax 网址更改为: 网址:“yourController/ReturnListProd” 到: 网址:“/api/products/add”

    【讨论】:

    • 谢谢...我想我需要 Deserealize 因为我将它作为来自客户端的参数传递。它有效......!
    • 没问题。 webApi 的优点之一是它为您处理序列化。由于您使用的是 webApi,因此我将通过一些建议来更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多