C#Newtonsoft反序列化JSON数组

时间:2017-05-16 21:07:52

标签: c# json serialization json.net deserialization

我尝试使用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#类:

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

2 个答案:

答案 0 :(得分:8)

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

// THE DOM IS READY.
var originalWidth = $(window).width();

//CHECK IF THE DROPDOWN SEARCH IS OPENED.
if ($('.icon-close').is(":visible")) {
    $(window).on('resize', function () {

        var newHeight = $(window).height();
        if ($(window).height() === newHeight) {
            $('.search-trigger .icon-search').addClass('icon-close');
            $('.search-dropdown').show();
        }

        if ($(window).width() !== originalWidth) {
            $('.icon-search').removeClass('icon-close');
            $('.search-dropdown').hide();
        }
    });
}

以这种方式反序列化:

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 的类并不会自动将其转换为对象集合。您需要从数组中声明要反序列化的类型集合类型(例如ListList<T>等)。

小提示:如有疑问,请使用json2csharp.com从json字符串生成强类型类。

答案 1 :(得分:0)

目前List有一个名为List的{​​{1}}个实例,尽管名称为:{not}不能使其成为列表。要反序列化JSON数组(priv),它需要一个数组或类似列表的类型,例如某些"priv": [...]的{​​{1}}。大概是List<T>,如果我们假设T实际上是第二种类型List<FileThing>(你有2)。