1

Json 文字列に「key1:value1」が含まれている場合、これを Dictionary 型に変換できます。

しかし、私の場合、上記の key:value とともに文字列の配列も含まれています。

{k1:v1; "key2\":[{\"Key11\":{\"key21\":\"Val21\",\"key22\":\"val22\"}]

(Json データには、いくつかの文字列といくつかの配列が含まれています。)

Dictionary<string, string[]> または Dictionary<string, ArrayList> を使用すると、文字列としての値で失敗します-文字列を文字列[]などに変換できません.

それでも Dictionary<string, object> を使用できますが、これを処理するより良い方法はありますか?

ありがとうパニ

4

2 に答える 2

1

コンパイル時に構造がわからない場合、JSON 文字列をシリアル化する方法は他にありません。それは Dictionary<string,object> でなければなりません。ただし、C# 4.0 を使用している場合は、DynamicObjectを使用できます。動的型付けでは型の解決が実行時まで延期されるため、このアプローチを使用してシリアル化すると、シリアル化されたオブジェクトを厳密に型指定されたものとして扱うことができます (ただし、コンパイル時のサポートはありません)。つまり、JSON スタイルのドット表記を使用してプロパティにアクセスできます。

MyDynamicJsonObject.key2

これを実現するには、DynamicObject から継承し、TryGetMemberメソッドを実装します (完全な実装があるこのリンクから引用)

public class DynamicJsonObject : DynamicObject
{
    private IDictionary<string, object> Dictionary { get; set; }

    public DynamicJsonObject(IDictionary<string, object> dictionary)
    {
        this.Dictionary = dictionary;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = this.Dictionary[binder.Name];

        if (result is IDictionary<string, object>)
        {
            result = new DynamicJsonObject(result as IDictionary<string, object>);
        }
        else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
        {
            result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
        }
        else if (result is ArrayList)
        {
            result = new List<object>((result as ArrayList).ToArray());
        }

        return this.Dictionary.ContainsKey(binder.Name);
    }
}

現在、動的型付けはインデクサー表記をサポートしていないため、配列の場合は、次のような表記を使用して回避策を実装する必要があることに注意してください。

MyDynamicJsonObject.key2.Item(0)
于 2012-05-08T16:29:25.347 に答える
0

あなたの例は有効な JSON ではありません。たとえば、すべてのキーと値を で囲む必要"があり{"k1":"v1"}ます。"\"""key2\""

JSONLintなどのツールを使用して、JSON が正しいことを検証します。

于 2012-05-08T17:13:06.277 に答える