C# JSON无法获取数据

C# JSON无法获取数据,c#,json,C#,Json,您好,我正在尝试用C#解析JSON页面,但似乎无法读取一些字符串,例如: "versions": [ { "date": 1340466559, "dl_link": "http://dev.bukkit.org/media/files/599/534/NoSwear.jar", "filename": "NoSwear.jar", "game_builds": [ "CB 1.2.5-R4.0

您好,我正在尝试用C#解析JSON页面,但似乎无法读取一些字符串,例如:

"versions": [
    {
        "date": 1340466559, 
        "dl_link": "http://dev.bukkit.org/media/files/599/534/NoSwear.jar", 
        "filename": "NoSwear.jar", 
        "game_builds": [
            "CB 1.2.5-R4.0"
        ], 
        "hard_dependencies": [], 
        "md5": "d0ce03e817ede87a9f76f7dfa67a64cb", 
        "name": "NoSwear v5.1", 
        "soft_dependencies": [], 
        "status": "Semi-normal", 
        "type": "Release"
    }, 
我怎么能读到呢? 这是我现在拥有的代码,适用于除此之外的所有其他代码:

public static void GetMoreInfo(string plugin)
{
    try
    {
        string url = "http://bukget.org/api/plugin/";

        var wc = new WebClient();
        var json = wc.DownloadString(url + plugin);
        var moreInfo = JsonConvert.DeserializeObject<MoreInfo>(json);

        foreach (var category in moreInfo.categories)
        {
            Categories += category + ", ";
        }
        Categories = Categories.Remove(Categories.Length - 2, 2);
    }
    catch (Exception)
    {

    }
    finally
    {
        if (string.IsNullOrEmpty(Categories))
        {
            Categories = "No data found.";
        }
    }
}

public class MoreInfo
{
    public string[] categories;
}
publicstaticvoid GetMoreInfo(字符串插件)
{
尝试
{
字符串url=”http://bukget.org/api/plugin/";
var wc=新的WebClient();
var json=wc.DownloadString(url+插件);
var moreInfo=JsonConvert.DeserializeObject(json);
foreach(moreInfo.categories中的var类别)
{
类别+=类别+“,”;
}
Categories=Categories.Remove(Categories.Length-2,2);
}
捕获(例外)
{
}
最后
{
if(string.IsNullOrEmpty(类别))
{
Categories=“未找到任何数据。”;
}
}
}
公共类MoreInfo
{
公共字符串[]类别;
}

我可能错了,但您收到的JSON是一个名为
versions
的数组,但您试图将其反序列化为一个
MoreInfo
对象,该对象公开一个名为
categories
的数组(除非您的示例中只是一个输入错误)。您是否尝试将
MoreInfo.categories
重命名为
MoreInfo.versions

更新

我认为这不会有什么不同,因为JSON转换器不知道如何处理数组中的每个对象。您需要提供一个对象来反序列化JSON数组中的每个元素

例如,尝试修改
MoreInfo
对象,将匹配的属性包含到JSON字符串(数组中的元素)中

然后尝试将JSON字符串反序列化为
列表

JsonConverter.DeserializeObject(json)

然后,您必须修改代码的其余部分,才能使用
MoreInfo
对象,而不是数组中的字符串

参考此答案


看到这个问题,接受的答案应该可以帮助您解决问题:

我可能错了,但是您收到的JSON是一个名为
版本的数组,但是您试图将其反序列化为一个
MoreInfo
对象,该对象公开一个名为
类别的数组(除非您的示例中它只是一个输入错误)。您是否尝试将
MoreInfo.categories
重命名为
MoreInfo.versions

更新

我认为这不会有什么不同,因为JSON转换器不知道如何处理数组中的每个对象。您需要提供一个对象来反序列化JSON数组中的每个元素

例如,尝试修改
MoreInfo
对象,将匹配的属性包含到JSON字符串(数组中的元素)中

然后尝试将JSON字符串反序列化为
列表

JsonConverter.DeserializeObject(json)

然后,您必须修改代码的其余部分,才能使用
MoreInfo
对象,而不是数组中的字符串

参考此答案


看到这个问题,公认的答案应该可以帮助您解决问题:

动态地处理json
而不是反序列化到具体的类如何

var wc = new WebClient();
var json = wc.DownloadString("http://bukget.org/api/plugin/test");

dynamic moreInfo = JsonConvert.DeserializeObject(json);

Console.WriteLine("{0} {1} {2}", moreInfo.name, moreInfo.desc, moreInfo.status);
string categories = String.Join(",", moreInfo.categories);
Console.WriteLine(categories);
还是你更喜欢经典的方法

var plugin = JsonConvert.DeserializeObject<Plugin>(json);
string categories = String.Join(",",plugin.categories);

public class Plugin
{
    public List<string> authors;
    public string bukkitdev_link;
    public List<string> categories;
    public string desc;
    public string name;
    public string plugin_name;
    public string status;
    public List<Version> versions;
}

public class Version
{
    public string date;
    public string filename;
    public string name;
    //.......
}
var plugin=JsonConvert.DeserializeObject(json);
string categories=string.Join(“,”,plugin.categories);
公共类插件
{
公开名单作者;
公共字符串bukkitdev_链接;
公开名单类别;
公共字符串描述;
公共字符串名称;
公共字符串插件名称;
公共字符串状态;
公开列表版本;
}
公共类版本
{
公共字符串日期;
公共字符串文件名;
公共字符串名称;
//.......
}

动态处理json
而不是反序列化到具体类怎么样

var wc = new WebClient();
var json = wc.DownloadString("http://bukget.org/api/plugin/test");

dynamic moreInfo = JsonConvert.DeserializeObject(json);

Console.WriteLine("{0} {1} {2}", moreInfo.name, moreInfo.desc, moreInfo.status);
string categories = String.Join(",", moreInfo.categories);
Console.WriteLine(categories);
还是你更喜欢经典的方法

var plugin = JsonConvert.DeserializeObject<Plugin>(json);
string categories = String.Join(",",plugin.categories);

public class Plugin
{
    public List<string> authors;
    public string bukkitdev_link;
    public List<string> categories;
    public string desc;
    public string name;
    public string plugin_name;
    public string status;
    public List<Version> versions;
}

public class Version
{
    public string date;
    public string filename;
    public string name;
    //.......
}
var plugin=JsonConvert.DeserializeObject(json);
string categories=string.Join(“,”,plugin.categories);
公共类插件
{
公开名单作者;
公共字符串bukkitdev_链接;
公开名单类别;
公共字符串描述;
公共字符串名称;
公共字符串插件名称;
公共字符串状态;
公开列表版本;
}
公共类版本
{
公共字符串日期;
公共字符串文件名;
公共字符串名称;
//.......
}

您所说的“似乎无法读取字符串”是什么意思?我看到您正在吞咽所有异常,因此您永远不会知道是否抛出了任何可能给您提供线索的内容。如果您注释掉try会发生什么?另外,您是否正在尝试将发布的JSON解析为MoreInfo的实例?在这种情况下,我认为MoreInfo的类定义需要与JSON匹配,而不仅仅是一个string[]字段。意外标记:星光。路径“版本”,第13行,位置18。
在我添加
公共字符串版本之后对于类moreinfo您所说的“似乎无法读取字符串”是什么意思?我看到您正在吞咽所有异常,因此您永远不会知道是否抛出了任何可能给您提供线索的内容。如果您注释掉try会发生什么?另外,您是否正在尝试将发布的JSON解析为MoreInfo的实例?在这种情况下,我认为MoreInfo的类定义需要与JSON匹配,而不仅仅是一个string[]字段。意外标记:星光。路径“版本”,第13行,位置18。
在我添加
公共字符串版本之后到类MoreInfofigure。我认为您需要执行一个
JsonConverter.DeserializeObject(json)
并修改
MoreInfo
以包含适当的属性。您有什么建议吗?我对JSON非常陌生:(.因为现在它变成了一个列表:o.更新了我的答案。您收到的JSON代表了一个对象列表,因此对于