2013-05-02 12 views
18

私はJSON文字列を持っています。逆シリアル化するにはいくつかの助けが必要です。JSONの複雑なオブジェクトをデシリアライズする方法

何もこれは私はいくつかの他のクラスを使用して気にしない、私はクラスの例を持っていますが、私はこれらのクラスを使用する必要はありませんJSON

{ 
"response": [ 
    { 
    "loopa": "81ED1A646S894309CA1746FD6B57E5BB46EC18D1FAff", 

    "drupa": "D4492C3CCE7D6F839B2BASD2F08577F89A27B4ff", 

    "images": [ 

     { 

     "report": { 

     "nemo": "unknown" 

    }, 

     "status": "rock", 

     "id": "7e6ffe36e-8789e-4c235-87044-56378f08m30df", 

     "market": 1 

}, 

    { 

"report": { 

"nemo": "unknown" 

}, 

"status": "rock", 

"id": "e50e99df3-59563-45673-afj79e-e3f47504sb55e2", 

"market": 1 

    } 

    ] 

} 

] 

} 

..です私のために働いていません。 これらはクラスである:

public class Report 
{ 
    public string nemo { get; set; } 
} 

public class Image 
{ 
    public Report report { get; set; } 
    public string status { get; set; } 
    public string id { get; set; } 
    public int market { get; set; } 
} 

public class Response 
{ 
    public string loopa { get; set; } 
    public string drupa{ get; set; } 
    public Image[] images { get; set; } 
} 

public class RootObject 
{ 
    public Response[] response { get; set; } 
} 

私はそこからいくつかの機能を使用できるように、私はすでにNewtonsoft.Jsonを持っていることを言及したいと思います。

どうすればいいですか?ありがとう。

+0

例外がスローされますか?エラーメッセージとは何ですか?デシリアライゼーションコードを投稿してください。 –

+0

exeptionはありません。私はちょうどデータを取得していません。クイックビューでこれを取得する:名前は現在のコンテキストに存在しません –

+1

答えを見て、この質問を閉じるために正しいものを確認してください。 – filipko

答えて

34

私のコードでこのように使用しています。それはうまくいきます。

以下

あなたは私がシナリオを持っていたし、この1つは私に

JObject objParserd = JObject .Parse(jsonString)を助けた

using System.Web.Script.Serialization; 

JavaScriptSerializer oJS = new JavaScriptSerializer(); 
RootObject oRootObject = new RootObject(); 
oRootObject = oJS.Deserialize<RootObject>(Your JSon String); 
+2

FYI:これはSystem.Web.Extensions.dllにあります –

25

はちょうどこのである必要があります:あなたのクラスが正しいか確認するためにhttp://json2csharp.com/

var jobject = JsonConvert.DeserializeObject<RootObject>(jsonstring); 

はあなたがここにJSON文字列を貼り付けることができます。

+0

私はこれを試しましたが、クイックビューに入るときに "名前が現在のコンテキストに存在しません"というメッセージしか表示されません –

+0

リンク先のWebサイトごとにクラスを試しましたか?私は、RootObjectクラスとResponseクラスの配列ではなく、リストを使用している点で異なります。違いがあるかどうかは分かりません。 – stevepkr84

+0

はい、テスト用に変更しましたが、オリジナルはこのサイトからのものです –

12

あなたがC#の2010以降を使用する場合は、dynamic typeを使用することができます。

dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring); 

その後、あなたは、ドット表記を使用して動的オブジェクトの属性や配列にアクセスすることができます:

string nemo = json.response[0].images[0].report.nemo; 
+0

いいアイデアでしたが、私のために働いていない可能性があります。 **ダイナミック式をコンパイルするために必要な1つ以上のタイプが見つかりません。あなたは参照を欠いています** –

+0

美しく動作します。 – batoutofhell

0

私は次のように使用しています:

using System.Web.Script.Serialization;  

    ... 

    public static T ParseResponse<T>(string data) 
    { 
     return new JavaScriptSerializer().Deserialize<T>(data); 
    } 
2

を記述する必要があるコードの一部です。

JObject arrayObject1 =(JObject)objParserd ["d"];

D myOutput = JsonConvert .DeserializeObject <D>(arrayObject1.ToString());

5

nugetパッケージマネージャ を使用してのVisual Studioにまずintallのnewtonsoft.jsonパッケージには、次のコードを追加し、

ClassName ObjectName = JsonConvert.DeserializeObject <ClassName> (jsonObject); 
0

shareInfoはクラスです:

public class ShareInfo 
     { 
      [JsonIgnore] 
      public readonly DateTime Timestamp = DateTime.Now; 
      [JsonProperty("sharename")] 
      public string ShareName = null; 
      [JsonProperty("readystate")] 
      public string ReadyState = null; 
      [JsonProperty("created")] 
      [JsonConverter(typeof(Newtonsoft.Json.Converters.UnixDateTimeConverter))] 
      public DateTime? CreatedUtc = null; 
      [JsonProperty("title")] 
      public string Title = null; 
      [JsonProperty("getturl")] 
      public string GettUrl = null; 
      [JsonProperty("userid")] 
      public string UserId = null; 
      [JsonProperty("fullname")] 
      public string Fullname = null; 
      [JsonProperty("files")] 
      public GettFile.FileInfo[] Files = new GettFile.FileInfo[0]; 
     } 

// POST request. 
      var gett = new WebClient { Encoding = Encoding.UTF8 }; 
      gett.Headers.Add("Content-Type", "application/json"); 
      byte[] request = Encoding.UTF8.GetBytes(jsonArgument.ToString()); 
      byte[] response = gett.UploadData(baseUri.Uri, request); 

      // Response. 
      var shareInfo = JsonConvert.DeserializeObject<ShareInfo>(Encoding.UTF8.GetString(response)); 
2
public static void Main(string[] args) 
{ 
    string json = @" { 
    ""children"": [ 
      { 
     ""url"": ""foo.pdf"", 
       ""expanded"": false, 
       ""label"": ""E14288-Passive-40085-2014_09_26.pdf"", 
       ""last_modified"": ""2014-09-28T11:19:49.000Z"", 
       ""type"": 1, 
       ""size"": 60929 
      } 
     ] 
    }"; 




    var result = JsonConvert.DeserializeObject<ChildrenRootObject>(json); 
    DataTable tbl = DataTableFromObject(result.children); 
} 

public static DataTable DataTableFromObject<T>(IList<T> list) 
{ 
    DataTable tbl = new DataTable(); 
    tbl.TableName = typeof(T).Name; 

    var propertyInfos = typeof(T).GetProperties(); 
    List<string> columnNames = new List<string>(); 

    foreach (PropertyInfo propertyInfo in propertyInfos) 
    { 
     tbl.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType); 
     columnNames.Add(propertyInfo.Name); 
    } 

    foreach(var item in list) 
    { 
     DataRow row = tbl.NewRow(); 
     foreach (var name in columnNames) 
     { 
      row[name] = item.GetType().GetProperty(name).GetValue(item, null); 
     } 

     tbl.Rows.Add(row); 
    } 

    return tbl; 
} 

public class Child 
{ 
    public string url { get; set; } 
    public bool expanded { get; set; } 
    public string label { get; set; } 
    public DateTime last_modified { get; set; } 
    public int type { get; set; } 
    public int size { get; set; } 
} 

public class ChildrenRootObject 
{ 
    public List<Child> children { get; set; } 
} 
+1

このコードスニペットは質問を解決するかもしれませんが[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers )本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – kayess

0

私は追加するには、この問題を解決しましたすべてのプロパティのパブリックセッター(デシリアライズする必要があります)。

関連する問題