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

2 に答える 2

4

dynamically具体的なクラスに逆シリアル化する代わりに、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;
    //.......
}
于 2012-07-16T19:15:56.600 に答える
0

私は間違っている可能性がありますが、受け取っているJSONは名前付きの配列ですが、名前付きの配列を公開するオブジェクトversionsに逆シリアル化しようとしています(例のタイプミスでない限り)。名前をに変更してみましたか?MoreInfocategoriesMoreInfo.categoriesMoreInfo.versions

アップデート

JSONコンバーターは配列内の各オブジェクトをどう処理するかを知らないので、それが違いを生むとは思いません。JSON配列の各要素を逆シリアル化するオブジェクトを提供する必要があります。

たとえばMoreInfo、JSON文字列(配列内の要素)に一致するプロパティを含めるようにオブジェクトを変更してみてください

[DataContract]
public class MoreInfo
{
  [DataMember]
  public DateTime date { get; set; }

  [DataMember]
  public string dl_link { get; set; }
  ...
}

次に、JSON文字列をList<MoreInfo>:に逆シリアル化してみます。

JsonConverter.DeserializeObject<List<MoreInfo>>(json)

MoreInfo次に、配列内の文字列ではなくオブジェクトを処理するように、コードの残りの部分を変更する必要があります。

この回答を参照してください

この質問を参照してください。受け入れられた回答は、問題の解決に役立つはずです。Json.NET:オブジェクトのリストを使用した逆シリアル化

于 2012-07-16T18:42:03.783 に答える