2017-05-12 2 views
0

から匿名型をデシリアライズ:は、私がこの形式で私のシリアル化されたJSONを持っているコレクション

string json = @"[{"Name": "std_id","Value": "111"}, {"Name": "cust_id","Value": "444"}]" 

私はこのような単一の匿名オブジェクトにデシリアライズするにはどうすればよい:

var paramObj = new {"std_id" = 111, "cust_id" = 444} 
+0

[このAをチェックnswer](http://stackoverflow.com/questions/4535840/deserialize-json-object-into-dynamic-object-using-json-net)。 – andreim

+0

これを見てください:http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object – nocodename

+0

JSONは固定ですか、動的ですか?言い換えれば、名前の値が変わるのか、それともいつも 'std_id'と' cust_id'ですか?それらが変更できる場合、匿名型は定義によってコンパイル時に定義されるため、匿名オブジェクトへのデシリアライズは機能しません。 –

答えて

1

JSONオブジェクトのNameValueプロパティの値が異なる可能性があるため、匿名オブジェクトにデシリアライズすることはできません。匿名型はコンパイル時に定義されます。つまり、プロパティ名を事前に定義しておく必要があります。それを回避する唯一の方法は、コード生成です。この状況では、残念です。代わりに、動的変数を使用してJObjectに逆シリアル化することをお勧めします。これはあなたが望むものにかなり近づくでしょう。

string json = @"[ 
    { ""Name"": ""std_id"", ""Value"": ""111"" }, 
    { ""Name"": ""cust_id"", ""Value"": ""444"" } 
]"; 

dynamic obj = new JObject(JArray.Parse(json) 
        .Select(t => new JProperty((string)t["Name"], t["Value"]))); 

はそこから、あなたはあなたのようなプロパティにアクセスすることができます匿名型のために(あなたは彼らが何であるかを知っていると仮定した場合)になります:ここではどのようだ

Console.WriteLine(obj.std_id); 
Console.WriteLine(obj.cust_id); 

あなたがわからない場合はどのような性質ある、あなたは辞書のようにそれらを列挙することができます。

foreach (var prop in obj) 
{ 
    Console.WriteLine(prop.Name + ": " + prop.Value); 
} 

はフィドル:https://dotnetfiddle.net/MRY2ny

+0

素晴らしい!詳しい説明はありがとうございます:) – izengod

+0

うれしい私は助けることができました。 –

1

なぜ匿名オブジェクト?あなたは、あなたが実際に持っているものIEnumerable<RootObjct>ある以下

public class RootObject 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

のような型にデシリアライズする必要があります。 Linqを使用して

RootObject = RootObjects.FirstOrDefault() 
1

のようにそれを逆シリアル化することができます。このように:

var serializer = new JavaScriptSerializer(); 
var deserializedResult = serializer.Deserialize<dynamic>(json); 

参考:

0
var definition = new { Name = "" }; 
string json1 = @"{'Name':'James'}"; 
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition); 
Console.WriteLine(customer1.Name); 
string json2 = @"{'Name':'Mike'}"; 
var customer2 = JsonConvert.DeserializeAnonymousType(json2, definition); 
Console.WriteLine(customer2.Name); 

ソースhttp://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm

0

私はこのソリューションは完璧ではないことを知っているが、それは、例えば作品あなたから提供され、のような結果を返しますあなたの例ではです。

アイデアは、カスタムJsonコンバータを作成することです。

まず、DTONクラスを作成して、JSONが含まれていないという名前の値の項目を提示しましょう。

public class NameValueJsonItem 
{ 
    public string Name { get; set; } 

    public string Value { get; set; } 
} 

コンバータの実装:

public class DynamicJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, 
     object existingValue, JsonSerializer serializer) 
    {   
     JToken token = JToken.Load(reader); 

     if (token == null || token.Type != JTokenType.Array) 
     { 
      return null; 
     } 

     List<NameValueJsonItem> parsedJson = token.ToObject<List<NameValueJsonItem>>(); 

     ExpandoObject result = new ExpandoObject(); 

     foreach (NameValueJsonItem item in parsedJson) 
     { 
      if (!String.IsNullOrEmpty(item.Name)) 
      { 
       (result as IDictionary<string, object>)[item.Name] = item.Value; 
      } 
     } 

     return result; 
    } 

    public override void WriteJson(JsonWriter writer, object value, 
     JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

確かに、あなたがしたい場合はメソッドの内部などを扱ういくつかの例外を追加することによって、それがより安全に行うことができます。

あなたはそのように、このコンバータを使用することができます:

dynamic result = JsonConvert.DeserializeObject<dynamic>(json, new DynamicJsonConverter()); 

はそれに役立つことを願っています。

関連する問題