C# Newtonsoft反序列化JSON数组

7
我正在尝试使用Newtonsoft反序列化数组,以便在列表框中显示来自基于云的服务器的文件,但无论我尝试什么,我总是得到以下错误:

Newtonsoft.Json.JsonReaderException:“解析值时遇到意外字符:[。路径'[0].priv',行4,位置15。”

这是一个尝试反序列化的示例:

[
 {
  "code": 200,
  "priv": [
     {
        "file": "file.txt",
        "ext": "txt",
        "size": "104.86"
     },
     {
        "file": "file2.exe",
        "ext": "exe",
        "size": "173.74"
     },

  ],
  "pub": [
     {
        "file": "file.txt",
        "ext": "txt",
        "size": "104.86"
     },
     {
        "file": "file2.exe",
        "ext": "exe",
        "size": "173.74"
     }
  ]
 }
]

我尝试使用这样的C#类:

我尝试使用这样的C#类:

    public class ListJson
{
    [JsonProperty("pub")]
    public List List { get; set; }
}

public class List
{
    [JsonProperty("file")]
    public string File { get; set; }

    [JsonProperty("ext")]
    public string Ext { get; set; }

    [JsonProperty("size")]
    public string Size { get; set; }
}
    [JsonProperty("priv")]
public List List { get; set; }
}

public class List
{
    [JsonProperty("file")]
    public string File { get; set; }

    [JsonProperty("ext")]
    public string Ext { get; set; }

    [JsonProperty("size")]
    public string Size { get; set; }
}

使用以下方法反序列化:

List<list> fetch = Newtonsoft.Json.JsonConvert.DeserializeObject<List<list>>(json);

3
你有两个叫做List的类? - Marc Gravell
1
类名 List 很容易引起混淆。 - Chit Khine
1
另外,还有一个名为List的C#类 - 请避免混淆已经存在的类名。 - t0mm13b
我使用了列表,因为它用于列出文件。 - Zeq
1
如果您正在使用Visual Studio,则可以使用(ctrl+c)将JSON复制到内存中。单击“编辑”->“特殊粘贴”->“将Json作为类粘贴”。 - user4573148
显示剩余2条评论
2个回答

12

您的JSON所需的正确C#类结构如下:

public class FileEntry
{
    public string file { get; set; }
    public string ext { get; set; }
    public string size { get; set; }
}

public class FileList
{
    public int code { get; set; }
    public List<FileEntry> priv { get; set; }
    public List<FileEntry> pub { get; set; }
}

以这种方式反序列化它:
var fetch = JsonConvert.DeserializeObject<FileList[]>(json);
var fileList = fetch.First(); // here we have a single FileList object

正如其他答案中所说,创建一个名为List的类并不能自动将其转换为对象集合。您需要声明要从数组反序列化的类型为集合类型(例如List<T>T[]等)。
小提示:如果有疑问,请使用json2csharp.com从JSON字符串生成强类型类。

现在我卡在实际使用反序列化后的JSON上 :/ 我真的很菜。 - Zeq
@Zeq 卡在哪里了?这里是一个关于.NET Fiddle的小演示(https://dotnetfiddle.net/ZEqKlT)。 - Federico Dipuma
好的,非常感谢。我会尝试从这里开始解决问题。此外,JSON 是从服务器下载的,因此根据文件而异。 - Zeq
@Zeq 哪一部分需要更改? - Brian Rogers
我使用json在启动时下载文件,代码如下:client.DownloadFile("https://www.zeroside.co/api/list/" + fetch[0].id + "/" + fetch[0].token, zerolist); - Zeq
没事,我已经想通了。 - Zeq

0

目前,List只有一个名为priv的实例,尽管它的名称是“列表”,但它并不是一个列表。要反序列化JSON数组("priv": [...]),它需要一个类似于数组或列表的类型,例如List<T>,其中T是某个类型。假设FileThing实际上是第二个名为List的类型(您有两个),那么可能是List<FileThing>


我的类名叫做list。 - Zeq
@Zeq 他们并不被称为列表(至少:不在同一个命名空间中)...因为这不是合法的C#...但这不是重点。问题不在于名称...而在于它需要是数组或类似列表的类型。您可以将List类型重命名为香蕉(Banana),我所说的一切将保持不变。 - Marc Gravell

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