3

JSON文字列を逆シリアル化しようとしています

[{ "key" : "1", "value" : "open"}, {"key" : "2", "value" : "closed"}, {"key" : "3", "value" : "pending"}]

C# 配列に。「'System.Array' の型に対して定義されたパラメーターなしのコンストラクターがありません」というエラーが表示されます。私はデータベースから JSON をプルしています。それをデシリアライズして、値にアクセスし、ユーザーが渡したものでデータベースの別のフィールドを更新できるようにしたいと考えていました。データベースに含まれる JSON 文字列は可変である可能性があるため、静的ではなく動的である必要があります。

以前辞書を使ってみましたが、うまくいきませんでした。そのため、配列に逆シリアル化することで別のアプローチを試みており、配列から辞書を作成するつもりでした。

これは、現時点で実装しようとしている方法です...他のいくつかを試しましたが...

 IList<Array> ValueArray = new JavaScriptSerializer().Deserialize<IList<Array>>(this.Parameter.ValueList); 
 //this.Parameter.ValueList just contains my JSON string

独自のクラスを作成せずにこれを行うことはできないと思いますか?

辞書を使ってみたらこうやってみた

Dictionary<string, string> ValueList =
                JsonConvert.DeserializeObject<Dictionary<string, string>>(this.Parameter.ValueList);  

しかし、このエラーを受け取りました

「現在の JSON 配列 ([1,2,3] など) を型 'System.Collections.Generic.Dictionary`2[System.String,System.String]' に逆シリアル化できません。型には JSON オブジェクトが必要です (例: {"このエラーを修正するには、JSON を JSON オブジェクト (例: {"name":"value"}) に変更するか、逆シリアル化された型を配列または実装する型に変更します。 JSON 配列から逆シリアル化できる List のようなコレクション インターフェイス (ICollection、IList など)。JsonArrayAttribute を型に追加して、強制的に JSON 配列から逆シリアル化することもできます。パス ''、行 1、位置 1."

そこで、代わりに配列を使用してみました。

4

3 に答える 3

7
var list = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json);

public class KeyValue
{
    public string key;
    public string value;
}

または単にKeyValue一時的に使用する

var dict = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json)
                                     .ToDictionary(x => x.key, x => x.value);

Json.Netを使用できる場合は、それを Dictionary に直接変換できます

var dict = JsonConvert.DeserializeObject<JArray>(json)
                     .ToDictionary(x => (string)x["key"], x => (string)x["value"]);
于 2012-07-25T17:51:55.270 に答える
2

試す

List<Dictionary<string, string>> ValueList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(this.Parameter.ValueList);

ただし、そのライブラリでサポートされているかどうかはわかりません。

于 2012-07-25T17:42:46.543 に答える
0

私はちょうどそれを理解しました。辞書に使用する必要がある特定の構文があります。この問題に最初に対処しようとしたときに最初に確認したのは、JSON 文字列 (私は JSONLint.com を使用しました) でした。これは実際に有効であり、それがバグの匂いから私を遠ざけました...

しかし、JSONがどのように見えるかを確認するために、辞書を取得してシリアル化することで、もう少しテストを行いました...辞書に変換するためのJSONの構文は次のとおりです

{"1":"保留中","2":"オープン","3":"クローズ"}

于 2012-07-25T18:24:02.020 に答える