反序列化对象时出现错误

4

我有一个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\"})才能正确反序列化。 要解决此错误,请将 JSON 更改为 JSON 对象(例如 {\"name\":\"value\"}),或将反序列化的类型更改为数组或实现集合接口的类型(例如 ICollection、IList),如可以从 JSON 数组反序列化的 List。也可以向类型添加 JsonArrayAttribute,以强制从 JSON 数组反序列化。 路径 '[0].datapoints',行 1,位置 40。
我已经查过了这个 。但它没有起作用。 我的代码有什么问题。请帮助我识别。先感谢您 :)

1
public datapoint datapoints { get; set; } 应该改为 List<datapoint> datapoints { get; set; } ...? - Paul Suart
2
顶级提示:您可以将JSON字符串复制到剪贴板,然后使用Visual Studio 2017通过“编辑|特殊粘贴|将JSON作为类粘贴”将其粘贴到源代码文件中,它会给您正确的类声明(尽管您可能需要稍微调整一下结果)。 - Matthew Watson
4个回答

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
你正在尝试将数组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; }
}

1
谢谢@Orel Eraki。它起作用了。还要特别感谢额外的积分。这是我有时会忘记的东西。再次感谢。 - Jyothish Bhaskaran

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; }
}

0

在您的 JSON 字符串中,每个 jsonMapper 对象的 datapoints 属性被包裹在方括号 ([]) 中,因此 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 字符串中删除方括号 ([])。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接