3

私はこのようなJSONを持っています:

{
    "name" : "MyCustomName",
    "my_node" : {
        "name" : "my_node_name"
    },
    "dict1":"value1",
    "dict2":"value2",
    "dict3":"value3",
    ...
}

およびオブジェクト:

class Node{
    string value;
}

class Sample:IDictionary<string, string>{ 
    Node node;
    string name; 
} 

Sampleクラスのノード名前は常に存在します。問題は、「dictN」フィールドがいくつになるかわからないということです...そしてそれがポイントです。

そして問題は、そのJSONをこのオブジェクトに逆シリアル化する方法ですか?

4

3 に答える 3

2

編集:明らかに、フィールド名が調和していても、デシリアライザーは、一般的な辞書フィールドと組み合わされた特定のフィールドに対処できません。

その場合は、としてデシリアライズDictionary<string, object>して結果を作成することをお勧めします。

var d = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);
Sample s = new Sample();
s.name = (string)d["name"];
Node n = new Node();
n.value = (string)((Dictionary<string, object>)d["my_node"])["name"];
foreach (var key in d.Keys.Except(new string[] { "name", "my_node" }))
{
    s.Add(key, (string)d[key]);
}
于 2012-11-29T15:57:41.537 に答える
1

初期のアイデア

以下は辞書シリアライザーです。空の文字列を受け入れないという1つの特殊なケースがあります。

private void SerializePerinatalModel<T>(IDictionary<string, object> dataModel, T perinatalModel)
    {
        Type sourceType = typeof(T);
        foreach (PropertyInfo propInfo in (sourceType.GetProperties()))
        {
            if (dataModel.ContainsKey(propInfo.Name))
            {
                //  if an empty string has been returned don't change the value
                if (dataModel[propInfo.Name].ToNullSafeString() != String.Empty)
                {
                    try
                    {
                        Type localType = propInfo.PropertyType;
                        localType = Nullable.GetUnderlyingType(localType) ?? localType;
                        propInfo.SetValue(perinatalModel, Convert.ChangeType(dataModel[propInfo.Name], localType), null); 
                    }
                    catch (Exception e)
                    {
                        //  ToDo: log update value errors
                    }

                }
            }

        }
    }

しかし、nullセーフにすることができます。null許容型を処理します。

JSONは本質的に辞書タイプであるため、トップレベルのタイプを反復処理することでそこに到達するはずです。

これは急いで書かれているので、アイデアのスケッチにすぎません。

より良いアイデア また、使用してみてください

foreach (var item in JsonData.Where(m => m.Key.Substring(0,4) == "dict"))
{
   // add item to collection
}

また、ビジネスを行う可能性があります。

于 2012-11-29T16:06:51.103 に答える
1

の形式で出力することができますDictionary<string, object>。代わりに、このコードを試してください。

System.Web.Script.Serialization.JavaScriptSerializer s = 
    new System.Web.Script.Serialization.JavaScriptSerializer();

var nodes = s.Deserialize<Dictionary<string, object>>(jsonString);
var dictNodes = nodes.Where(w => w.Key.StartsWith("dict"));
于 2012-11-29T16:09:59.810 に答える