0

わかりましたので、以前は JSON.NET で行き詰まっていましたが、再び立ち往生しています。最後の質問のおかげで、皆さんが私を助けてくれて、プロジェクトを正常に完了しました:3. ただし、実際にはキーを持たない JSON を逆シリアル化する必要があります。それはできますが、整数であり、0 から 50 の間で変化する可能性があるため、これを行う方法がわかりません。私は IDictionary を使用しようとしましたが、それは惨めに失敗しました... とにかく、JSON は次のとおりです。

{
"response": {
    "success": 1,
    "current_time": 1362339098, // this will return the time when cache was generated
    "prices": {
        "35": { // defindex
            "11": { // quality
                "0": { // price index ( crate # or unusual effect, 0 when not used )
                    "current": { // current price
                        "currency": "keys",
                        "value": 39,
                        "value_high": 41,
                        "date": 1357515306 // date when the price was updated
                    },
                    "previous": { // previous price
                        "currency": "keys",
                        "value": 37,
                        "value_high": 39
                    }
                }
            },
            "3": { // quality
                "0": { // price index
                    "current": {
                        "currency": "metal",
                        "value": 0.33,
                        "value_high": 0.66
                    }
                }
            }
        },
        "5002": { // refined metal, useful for converting usd prices into metal
            "6": {
                "0": {
                    "current": {
                        "currency": "usd",
                        "value": 0.39,
                        "value_high": 0.42,
                        "date": 1358090106
                    }
                }
            }
        },                          
        "5022": { // one of the crate defindex
            "6": {
                "1": { // crate #1
                    "current": {
                        "currency": "metal",
                        "value": 1.33,
                        "value_high": 1.55,
                        "date": 1357515175
                    }
                }
            }
        }
    }
}
}

(Dat の書式設定... もう一度...)

そして、私の哀れな試みをここに示します:

public class Json1 {
    public Json2 response { get; set; }
}
public class Json2 {
    public int success { get; set; }
    public string current_time { get; set; }
    public IDictionary<int, Json3> prices { get; set; }
}
public class Json3 {

}
public class Json4 {

}
public class Json5 {
    public Json6 current { get; set; }
}
public class Json6 {
    public string currency { get; set; }
    public string value { get; set; }
    public string value_high { get; set; }
}

Json 3と4は、削除して別のことを試しているため、空です...

しかし、ええ... jsonに慣れてきましたが、これを理解できません。フレンドリーな回答は、事前に大歓迎です。

(いくつかの float と long で文字列を使用したことは知っていますが、これは意図的なものでしたが、変更できると思います)

4

3 に答える 3

2

私は個人的に Newtonsoft を使用しています。Json は非常に優れています。http: //json.codeplex.com/で見つけることができ、 匿名型と他の多くのものの間の linq を処理します。

良いドキュメントもあります。あなたは大丈夫なはずです:

簡単な例:

シリアル化:

var listId = new List<int>();
listId.Add(1);
listId.Add(2);
listId.Add(3);
String jsonList = JsonConvert.SerializeObject(listId);

逆シリアル化:

List<int> listID = JsonConvert.DeserializeObject<List<int>>(JsonListOfID);
于 2013-04-11T18:29:26.123 に答える
1

Visual Studio 2012 を使用している場合は、[編集] -> [形式を選択して貼り付け] -> [JSON をクラスとして貼り付け] を実行して、JSON でこれを生成できます。この場合、プロパティ名は動的であるため、おそらく役に立たないでしょう。たぶん、構造は役に立ちます。別のオプションは、応答を JToken に解析してから、linq を使用してデータを取得することです。

public class Rootobject
{
public Response response { get; set; }
}

public class Response
{
public int success { get; set; }
public int current_time { get; set; }
public _35 _35 { get; set; }
public _5002 _5002 { get; set; }
public _5022 _5022 { get; set; }
}

public class _35
{
public _11 _11 { get; set; }
public _3 _3 { get; set; }
}

public class _11
{
public _0 _0 { get; set; }
}

public class _0
{
public Current current { get; set; }
public Previous previous { get; set; }
}

public class Current
{
public string currency { get; set; }
public int value { get; set; }
public int value_high { get; set; }
public int date { get; set; }
}

public class Previous
{
public string currency { get; set; }
public int value { get; set; }
public int value_high { get; set; }
}

public class _3
{
public _01 _0 { get; set; }
}

public class _01
{
public Current1 current { get; set; }
}

public class Current1
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
}

public class _5002
{
public _6 _6 { get; set; }
}

public class _6
{
public _02 _0 { get; set; }
}

public class _02
{
public Current2 current { get; set; }
}

public class Current2
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}

public class _5022
{
public _61 _6 { get; set; }
}

public class _61
{
public _1 _1 { get; set; }
}

public class _1
{
public Current3 current { get; set; }
}

public class Current3
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}
于 2013-04-11T18:30:55.333 に答える
1

あなたは正しい軌道に乗っていましたIDictionary。この JSON 構造は、実際にはネストされた辞書の集まりです。クラスを次のように作成してみてください。

public class Json1
{
    public Json2 response { get; set; }
}
public class Json2
{
    public int success { get; set; }
    public string current_time { get; set; }
    public IDictionary<int, IDictionary<int, IDictionary<int, Json5>>> prices { get; set; }
}
public class Json5
{
    public Json6 current { get; set; }
}
public class Json6
{
    public string currency { get; set; }
    public string value { get; set; }
    public string value_high { get; set; }
}

次のようにデシリアライズできます。

Json1 obj = JsonConvert.DeserializeObject<Json1>(json);

逆シリアル化すると、次のような値を取得できます。

foreach (KeyValuePair<int, IDictionary<int, IDictionary<int, Json5>>> price in obj.response.prices)
{
    Console.WriteLine("price index: " + price.Key);
    foreach (KeyValuePair<int, IDictionary<int, Json5>> quality in price.Value)
    {
        Console.WriteLine("\t quality: " + quality.Key);
        foreach (KeyValuePair<int, Json5> index in quality.Value)
        {
            Console.WriteLine("\t\t index: " + index.Key);
            Console.WriteLine("\t\t\t currency: " + index.Value.current.currency);
            Console.WriteLine("\t\t\t value: " + index.Value.current.value);
            Console.WriteLine("\t\t\t value_high: " + index.Value.current.value_high);
        }
    }
}

上記の出力 (動作することを示すため):

price index: 35
        quality: 11
                index: 0
                        currency: keys
                        value: 39
                        value_high: 41
        quality: 3
                index: 0
                        currency: metal
                        value: 0.33
                        value_high: 0.66
price index: 5002
        quality: 6
                index: 0
                        currency: usd
                        value: 0.39
                        value_high: 0.42
price index: 5022
        quality: 6
                index: 1
                        currency: metal
                        value: 1.33
                        value_high: 1.55
于 2013-04-15T20:02:56.527 に答える