C # ile JSON serisini kaldırın


206

Nesnelerin bir listesine bir Facebook arkadaşınızın Grafik API çağrısının serisini kaldırmaya çalışıyorum . JSON nesnesi şöyle görünür:

{"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);

Çalışmıyor, çünkü ilkel nesne geçersiz. Bunu nasıl serileştirebilirim?


3
özellikle böyle json hitap için özel bir deserializer yazın ...
ashutosh raina

2
ya da bir kullanabilirsiniz Dictionary<string,string>, göz
Kakashi

9
Arkadaşın: json2csharp.com
nawfal

4
Aslında görsel stüdyolar (2013 veya 2012'den itibaren web araçları yüklü olarak) şu işlevlere sahiptir: Düzenle> Özel Yapıştır>
JSON'u

Yanıtlar:


264

Bunun gibi bir yapı oluşturmanız gerekir:

public class Friends
{

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

public class FacebookFriend
{

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

O zaman şunları yapabilmelisiniz:

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

Sınıflarımın adları sadece bir örnektir. Uygun isimler kullanmalısınız.

Örnek bir test ekleme:

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);
}

üretir:

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

3
Yeh, yapmak istemediğim şey, çocukları tutmak için yeni bir nesne yarat. Bence ilkel nesneyi çıkararak jsonu alt edeceğim. Teşekkür ederim.

@ Kevin Holditch Düzeltme için teşekkürler. Önemli bir
parçayı

2
Ne bu System.Web.Script.Serialization.JavaScriptSerializer () hakkında sevmiyorum her zaman tanımlanmış bir T türü gerekir. Java tüm anonim kalır bu org.java kitaplığı (paket) var: "JSONObject [" param "]. JSONarray (5)" vb
spor

2
İd ve ​​name özelliklerine ilişkin ayarlayıcıların herkese açık bırakılması gerektiğini unutmayın. Özel veya korumalı olarak ayarlanırsa, serileştirme hatasız olarak yürütülür ancak tüm veriler boş olacaktır.
Isaac Zais

2
@sports, bunu dinamik bir diziden serileştirerek C # ile yapabilirsiniz, ancak bilinen bir türe serileştirme yaparsanız performans çok daha iyidir.
PRMan

50

Bazen dinamik nesneleri tercih ederim:

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);
}

Bunun yararlı olduğu bir örneğe örnek olarak, serileştirmeye çalıştığım nesnenin bir arayüz olan bir özellik içerdiği
zamandı

2
Bir açıklama yapılabilir.
Peter Mortensen

@Icarus tarafından kabul edilen cevap yerine neden bunu tercih edesin?
Sorgulayan

@Sorgulama, güçlü tür sınıflarına yönelik serileştirme, sınıflarınızda bulunmayan tüm özellikleri göz ardı ederken dinamik nesnelere yönelik serileştirme, dinamik olarak dönecektir. (dediğim gibi, bazen standart değil)
Bishoy Hanna

39

Bu sınıfları sizin için otomatik olarak oluşturmanın harika bir yolu JSON çıktısını kopyalayıp buraya atmaktır:

http://json2csharp.com/

Bu, serileştirme için sınıflarınıza dokunmanız için bir başlangıç ​​noktası sağlayacaktır.


28

JSON içeriğini sözlük ve JavaScriptSerializer yardımıyla kolayca ayrıştırabiliriz. İşte bir ashx dosyasından JSON içeriğini ayrıştırmak örnek kod.

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();

3
Bu sözleşme, veri sözleşmeleri oluşturmak için zamanınız veya gereksiniminiz yoksa çok kullanışlıdır. Özellikle JSON yapısının derinliklerine gömülmüş birkaç özellikle ilgileniyorsanız. Bu durumda, ihtiyacınız olan şeylere gitmek için bir dizi ifade kullanabilirsiniz. Not: serileştirme türü de aşağıdakilerden biri olabilir: Sözlük <string, object> veya ArrayList (bir düğümün tekrarlayan bir yapısı olduğunda).
Philippe Monnet

1
Bu bir çalışma zamanı özel durum olsun: Kodun serisini 'System.String' türü için tanımlanmış parametresiz yapıcı yok.
RSK

20

Newtonsoft.JSONbu tür durumlar için iyi bir çözümdür. Ayrıca Newtonsof.JSONdaha hızlı gibi başkaları daha JavaScriptSerializer, DataContractJsonSerializer.

Bu örnekte şunları yapabilirsiniz:

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

Daha sonra jsonData öğesini yayınlayabilir JArrayve forher yinelemede veri almak için bir döngü kullanabilirsiniz .

Ayrıca, bir şey eklemek istiyorum:

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

Dinamik nesne ile çalışmak ve Newtonsoft serialize kullanmak iyi bir seçimdir.


15

Icarus ile hemfikirim (eğer yapabilirsem yorum yapardım), ancak CustomObject sınıfını kullanmak yerine, bir Sözlük (Facebook'un bir şey eklediği durumda) kullanırdım.

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

veya

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

3
Dinamik kullanımı yeni sürümlerde daha iyi çalışır. public IList<IDictionary<string, dynmaic>> data { get; set; }
BJury

3

Serile:

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

Response.Write(jsonData);

Deserialization ::

Dinamik bir nesnenin serisini kaldırmak için

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

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

Response.Write(res.Name);

3

Bu uzantıları kullanabilirsiniz

public static class JsonExtensions
{
   public static T ToObject<T>(this string jsonText)
   {
       return JsonConvert.DeserializeObject<T>(jsonText);
   }

   public static string ToJson<T>(this T obj)
   {
       return JsonConvert.SerializeObject(obj);
   }
}


1

Eğer kullanıyorsanız .NET Core'u 3.0, kullanabileceğiniz System.Text.Json JSON serisini (şimdi yerleşik olan).

İlk adım JSON'u modellemek için sınıflar oluşturmaktır. Bu konuda yardımcı olabilecek birçok araç vardır ve buradaki bazı cevaplar bunları listelemektedir.

Bazı seçenekler http://json2csharp.com , http://app.quicktype.io veya Visual Studio'yu kullanın (menü DüzenleÖzel YapıştırJSON'u sınıf olarak yapıştır ).

public class Person
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class Response
{
    public List<Person> Data { get; set; }
}

Sonra kullanarak serisini kaldırabilirsiniz:

var people = JsonSerializer.Deserialize<Response>(json);

camelCaseİşleme gibi ayarlar eklemeniz gerekiyorsa , serileştirici ayarlarını şu şekilde serileştiriciye geçirin:

var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
var person = JsonSerializer.Deserialize<Response>(json, options);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.