反序列化对象时出错

时间:2018-04-18 09:08:04

标签: c# json json.net

我有一个JSON字符串。

[  
 {  
  "target":"FDOL00001",
  "datapoints":[  
     {  
        "y":72.564,
        "x":1523858700
     }
  ]
 },
 {  
  "target":"FDOL00001",
  "datapoints":[  
     {  
        "y":86.366,
        "x":1523858700
     }
  ]
 },
 {  
  "target":"FDOL00001",
  "datapoints":[  
     {  
        "y":73.90195818815343,
        "x":1523858700
     }
  ]
 }
]

我正在尝试将其反序列化为集合。但是我收到了一个错误。有人可以指导我以正确的方式解决这个问题吗?

class datapoint
{
    [JsonProperty("x")]
    public int x { get; set; }
    [JsonProperty("y")]
    public decimal y { get; set; }
}
class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }
    [JsonProperty("datapoints")]
    public datapoint datapoints { get; set; }
}

我正在尝试使用以下代码进行转换。

var json = JsonConvert.DeserializeObject<List<jsonMapper>>(objText);

我得到的错误是

  

无法将当前JSON数组(例如[1,2,3])反序列化为“ISSPortal2.datapoint”类型,因为该类型需要一个JSON对象(例如{\“name \”:\“value \”})来正确反序列化。\ r \ n要修复此错误要么将JSON更改为JSON对象(例如{\“name \”:\“value \”}),要么将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。\ r \ nPath'[0] .datapoints',第1行,第40位。

我已经检查了this。但它不起作用。 我的代码有什么问题。请帮我识别一下。在此先感谢:)

4 个答案:

答案 0 :(得分:1)

您需要将datapoints声明为某种类型的集合(例如IEnumerableIList

class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }

    // This has changed to IEnumerable<datapoint>
    [JsonProperty("datapoints")]
    public IEnumerable<datapoint> datapoints { get; set; }
}

答案 1 :(得分:1)

您正尝试将数组datapoint[]反序列化为datapoint

更改

public datapoint datapoints { get; set; }

public datapoint[] datapoints { get; set; }

加分: C#命名约定,建议您在公共财产中使用大写字母。

class Datapoint
{
    [JsonProperty("x")]
    public int X { get; set; }
    [JsonProperty("y")]
    public decimal Y { get; set; }
}
class JsonMapper
{
    [JsonProperty("target")]
    public string Target { get; set; }
    [JsonProperty("datapoints")]
    public Datapoint Datapoints { get; set; }
}

答案 2 :(得分:0)

你的课程应该是这样的:

public class datapoint
{
    [JsonProperty("x")]
    public int x { get; set; }
    [JsonProperty("y")]
    public decimal y { get; set; }
}
public class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }
    [JsonProperty("datapoints")]
    public List<datapoint> datapoints { get; set; }
}

答案 3 :(得分:0)

datapoints上的json字符串中,每个jsonMapper对象的属性都包含在方括号([])中,然后datapoints被解释为集合对象而不是单个对象。 你的jsonMapper类是

class jsonMapper
{
    [JsonProperty("target")]
    public string target { get; set; }
    [JsonProperty("datapoints")]
    public datapoint datapoints { get; set; }
}

datapoints属性不是数组或任何集合对象。

您可以将您的财产从public datapoint datapoints { get; set; };更改为
public List<datapoint> datapoints { get; set; };或者您可以从json字符串中删除方括号([])。