web-dev-qa-db-ja.com

C#でJSONをデシリアライズする

私はFacebookの友達グラフAPI呼び出しをオブジェクトのリストに逆シリアル化しようとしています。 JSONオブジェクトは次のようになります。

{"data":[{"id":"518523721","name":"ftyft"},
         {"id":"527032438","name":"ftyftyf"},
         {"id":"527572047","name":"ftgft"},
         {"id":"531141884","name":"ftftft"},
         {"id":"532652067","name"... 

List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result);

プリミティブオブジェクトが無効なので動作しません。
これをデシリアライズするにはどうすればよいですか。

189
user989818

あなたはこのような構造を作成する必要があります:

public class Friends
{

    public List<FacebookFriend> data {get;set;}
}

public class FacebookFriend
{

    public string id {get;set;}
    public string name {get;set;}
}

それからあなたはできるはずです:

Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);

私のクラスの名前はほんの一例です。あなたは正しい名前を使うべきです。

サンプルテストを追加する:

string json=
    @"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}";


Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json);

foreach(var item in facebookFriends.data)
{
   Console.WriteLine("id: {0}, name: {1}",item.id,item.name);
}

を生成します。

id: 518523721, name: ftyft
id: 527032438, name: ftyftyf
id: 527572047, name: ftgft
id: 531141884, name: ftftft
237
Icarus

動的オブジェクトを好むことがあります。

public JsonResult GetJson()
{
  string res;
  WebClient client = new WebClient();

  // Download string
  string value = client.DownloadString("https://api.instagram.com/v1/users/000000000/media/recent/?client_id=clientId");

  // Write values
  res = value;
  dynamic dyn = JsonConvert.DeserializeObject(res);
  var lstInstagramObjects = new List<InstagramModel>();

  foreach(var obj in dyn.data)
  {
    lstInstagramObjects.Add(new InstagramModel()
    {
      Link = (obj.link != null) ? obj.link.ToString() : "",
      VideoUrl = (obj.videos != null) ? obj.videos.standard_resolution.url.ToString() : "",
      CommentsCount = int.Parse(obj.comments.count.ToString()),
      LikesCount = int.Parse(obj.likes.count.ToString()),
      CreatedTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((double.Parse(obj.created_time.ToString()))),
      ImageUrl = (obj.images != null) ? obj.images.standard_resolution.url.ToString() : "",
      User = new InstagramModel.UserAccount()
             {
               username = obj.user.username,
               website = obj.user.website,
               profile_picture = obj.user.profile_picture,
               full_name = obj.user.full_name,
               bio = obj.user.bio,
               id = obj.user.id
             }
    });
  }

  return Json(lstInstagramObjects, JsonRequestBehavior.AllowGet);
}
47
Bishoy Hanna

あなたのためにこれらのクラスを自動的に生成する素晴らしい方法はあなたのJSON出力をコピーしてここに投げることです:

http://json2csharp.com/ /

逆シリアル化のためにクラスを修正するための出発点を提供します。

26
Jack Fairfield

非常に簡単に私たちは辞書とJavaScriptSerializerの助けを借りてJSONを解析することができます。これは私がashxファイルからJSONを解析するためのサンプルコードです。

var jss = new JavaScriptSerializer();
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json);
string _Name = sData["Name"].ToString();
string _Subject = sData["Subject"].ToString();
string _Email = sData["Email"].ToString();
string _Details = sData["Details"].ToString();
25
Thomas

Newtonsoft.JSONはこの種の状況には良い解決策です。またNewtonsof.JSONJavaScriptSerializerDataContractJsonSerializerのような他のものより速いです。

このサンプルでは、​​次のことができます。

var jsonData = JObject.Parse("your json data here");

その後、jsonDataをJArrayにキャストし、forループを使用して各反復でデータを取得できます。また、追加したいと思います。

for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
    var data = jsonData[i - 1];
}

動的オブジェクトを操作してNewtonsoftシリアライズを使用するのは良い選択です。

15
OnurBulbul

私はIcarusに同意します(できればコメントしたでしょうが)、 CustomObject クラスを使う代わりに、 Dictionary を使います(facebookが何かを追加する場合)。

private class MyFacebookClass
{
   public IList<IDictionary<string, string>> data { get; set; }
}

または

private class MyFacebookClass
{
   public IList<IDictionary<string, object>> data { get; set; }
}
14
Stijn Bollen

正しくフォーマットされたJSON文字列を使用できる限り、必要なすべてのコードを支援する別のサイトを次に示します。

https://app.quicktype.io/

0
Liknes

シリアル化:

// Convert object to JOSN string format  
string jsonData = JsonConvert.SerializeObject(obj);  

Response.Write(jsonData);  

デシリアライゼーション:

動的オブジェクトを逆シリアル化する

  string json = @"{  
      'Name': 'name',  
      'Description': 'des'  
    }";  

var res = JsonConvert.DeserializeObject< dynamic>(json);  

Response.Write(res.Name);
0
ravula sandeep