JSON'u C # ile nasıl ayrıştırabilirim?


455

Takip koduna sahibim:

var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);

Giriş responsecontentJSON, ancak bir nesneye düzgün ayrıştırılmamış. Nasıl doğru şekilde serisini kaldırmalıyım?


7
Hey bu bağlantıyı denemek isteyebilirsiniz techblog.procurios.nl/k/n618/news/view/14605/14863/…
Vamsi

34
Orada Jsoniçinde System.Web.Helpersvar, JsonQueryStringConverteriçinde System.ServiceModel.Web, var JavascriptSerializeriçinde System.Web.Script.Serialization, DataContractJsonSerializeriçinde System.Runtime.Serialization.Json, halt MS hatta üçüncü parti dahil edilmesine karar verilmiştir Json.NETonun ASP.NET Web API. Bunun yeterli olmadığını düşünüyorsanız, MS geliyor System.Jsonama şu anda tüketim için uygun değil. Gitmek için yol Microsoft gitmek için yol .... En iyi görünümlü ad alanı ile seçin.
nawfal

4
@fusi gerisi ayrı meclislerde. Google ad alanı / sınıf adı, msdn belgelerinde oldukları montajı bulacaksınız. Sadece bu montaja referans ekleyin.
nawfal

1
Sadece tamamlanmasını, orada da JsonValueiçinde Windows.Data.Jsonhangi yalnızca Windows 8 için ve üzerindedir. Onu seviyorum. MS görev
başında

5
NewtonSoft sitesinde bir karşılaştırma sayfası var (taraflı olabilir, ancak yine de ilginç olabilir): newtonsoft.com/json/help/html/jsonnetvsdotnetserializers.htm . Özellikle Saçma Sözlük serileştirme satırını sevdim :)
Ohad Schneider

Yanıtlar:


366

Json.NET (Newtonsoft.Json NuGet paketi) kullanmadığınızı varsayıyorum . Bu durumda, denemelisiniz.

Aşağıdaki özelliklere sahiptir:

  1. LINQ - JSON
  2. .NET nesnelerinizi hızla JSON'a dönüştürmek için JsonSerializer ve tekrar
  3. Json.NET isteğe bağlı olarak hata ayıklama veya görüntüleme için iyi biçimlendirilmiş, girintili JSON üretebilir
  4. Bir sınıfın serileştirilme şeklini özelleştirmek için JsonIgnore ve JsonProperty gibi özellikler sınıfa eklenebilir
  5. JSON'u XML'e ve XML'den dönüştürme yeteneği
  6. Birden çok platformu destekler: .NET, Silverlight ve Compact Framework

Bak örnek aşağıda. Bu örnekte, JsonConvertsınıf bir nesneyi JSON'a ve JSON'dan dönüştürmek için kullanılır. Bu amaçla iki statik yöntemi vardır. Bunlar SerializeObject(Object obj)ve DeserializeObject<T>(String json):

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Expiry": "2008-12-28T00:00:00",
//  "Price": 3.99,
//  "Sizes": [
//    "Small",
//    "Medium",
//    "Large"
//  ]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);

18
varHedefimin tam yapısını bilmiyorsam, bir tür değişkenine serpiştirebilir miyim ? Özellikle, Ralli Kullanıcı Öyküleri kullanıyorum ve bunları nesnelere dönüştürmek istiyorum.
Pedro Dusso

16
@VANDERWEYENJonathan - modern bir web tarayıcısında, JSON.parse (dize) ve JSON.stringify (nesne), her ikisi de tarihleri ​​yukarıdaki yanıtta gösterilen biçim olan ISO8601 dizeleri olarak işler. İnsanlar alakasız olduğuna karar vermeden önce standardınızı güncellemek isteyebilirsiniz. İnsanların standartlarınıza ihtiyaç duyduklarından çok daha fazla tarihe ihtiyacı vardır.
Peter Wone

3
@PeterWone: Hayır, bir tarih değil dizeyiJSON.parse('{"Expiry": "2008-12-28T00:00:00"}').Expiry döndürür . o olabilir dönüştü bir aracılığı fakat tarihleri hakkında hiçbir şey bilmiyor. Her dize değerini bir desene karşı kontrol eden bir reviver iletmeniz gerekir. "2008-12-28T00:00:00"Datenew Date(str)JSON.parse
TJ Crowder

3
3.703 saniye 3s ve 703ms ile aynı olduğundan ve ayırıcı ondalık bir nokta olduğundan, bunun üç ondalık basamağa saniye olduğunu söyledim.
Peter Wone

38
Neden herkes alakalı dahil böyle sorunu var require, include, importveya usingcevaplarında ifadeleri. Bu bir çizgi acıyor mu?
Tomáš Zato - Monica'yı

285

Burada yanıtlandığı gibi - JSON C # dinamik nesneye serileştirmek?

Json.NET kullanarak oldukça basit:

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

Veya Newtonsoft.Json.Linq kullanarak:

dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

13
@MaxHodges, haklısın. Ben sadece JSON dize değerlerini ayrıştırma göstermek için satır içi "sihirli dizeleri" kullanılır. Kaçan çift tırnak işaretleri ile karmaşık görünmesini istemiyordu. Gerçek kodda genellikle bir yerden değişken olarak elde edilen veya parametre olarak iletilen JSON dizeleri bulunur.
Dmitry Pavlov

4
.Net 4 olmadan 'dinamik' anahtar kelimeniz yoktur. Beyan için 'var stuff' ifadesini kullanabilir ve 'stuff.Name' ve 'stuff.Address.City' yerine 'stuff ["Name"]' ve 'stuff ["Address"] ["City"]' öğelerini kullanabilirsiniz .
Fil

1
@Fil Bu size bir tür değeri verir ve a'da objectdizin oluşturmayı kullanamazsınız object.
Alex

138

İşte bazı seçenekler olmadan üçüncü parti kütüphaneleri kullanılarak:

// For that you will need to add reference to System.Runtime.Serialization
var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }"), new System.Xml.XmlDictionaryReaderQuotas());

// For that you will need to add reference to System.Xml and System.Xml.Linq
var root = XElement.Load(jsonReader);
Console.WriteLine(root.XPathSelectElement("//Name").Value);
Console.WriteLine(root.XPathSelectElement("//Address/State").Value);

// For that you will need to add reference to System.Web.Helpers
dynamic json = System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
Console.WriteLine(json.Name);
Console.WriteLine(json.Address.State);

System.Web.Helpers.Json hakkında daha fazla bilgi için bağlantıya bakın .

Güncelleme : Günümüzde almanın en kolay yolu NuGet paketiniWeb.Helpers kullanmaktır .


Daha önceki Windows sürümleri ile ilgilenmiyorsanız, Windows.Data.Jsonad alanının sınıflarını kullanabilirsiniz :

// minimum supported version: Win 8
JsonObject root = Windows.Data.Json.JsonValue.Parse(jsonString).GetObject();
Console.WriteLine(root["Name"].GetString());
Console.WriteLine(root["Address"].GetObject()["State"].GetString());

ASP.NET web sitemde (4.5) System.Web.Helpers'ı neden göremiyorum? XElement, XPathSelectElement, VisualStudio'm için bilinmiyor. Nasıl eğitilir?
Budda

Peki, ilgili kitaplıklar için referanslar eklemeniz gerekir (yukarıdaki yorumlarda yazıldığı gibi), daha fazla bilgi için bu makaleye bakın . Ayrıca, bu soru ilginizi çekebilir.
qqbenq

2
Burada açıklanan Web.Helpers yöntemini kullandım ancak bu gönderi tarafından çözülen bir sorunla karşılaştım: stackoverflow.com/questions/7066726/…
Alex

1
WPF ile çalışarak System.Runtime.Serialization.Json kullanarak aşağıdaki ad alanını kullanarak; System.Xml.XPath kullanarak; System.Xml.Linq kullanarak;
Shahid Neermunda

3
Json.Net artık üçüncü taraflara ait bir bileşen değil. Microsoft bu günlerde kendilerini kullanıyor. Web API'sındaki varsayılan serilizer.
Liam

62

.NET 4 kullanabiliyorsanız, şu adrese bakın : http://visitmix.com/writings/the-rise-of-json (archive.org)

İşte bu siteden bir pasaj:

WebClient webClient = new WebClient();
dynamic result = JsonValue.Parse(webClient.DownloadString("https://api.foursquare.com/v2/users/self?oauth_token=XXXXXXX"));
Console.WriteLine(result.response.user.firstName);

Bu son Konsol.WriteLine oldukça tatlı ...


Üzgünüm, ilk cevapladığımdan beri işler değişmiş gibi görünüyor. Etrafa bir göz
atmam

7
Bu kütüphaneyi bulmayı dört gözle bekliyorum. Düzenleme: bu mu : dynamicjson.codeplex.com ?
user989056

1
Sınıf ElonU burada ne anlama geldiğini bilmiyorum, ama Windows.Data.Json (sadece Windows 8 ve üstü için - garip) ve aynı zamanda hala önizleme ve System.Json aynı "JsonValue" olduğunu bilmiyorum Tanrı sadece onun çıkıp çıkmayacağını bilir. Json söz konusu olduğunda MS beni şaşırtıyor.
nawfal

35

Bunun için herhangi bir üçüncü taraf kitaplığı gerektirmeyen ancak System.Web.Extensions'a başvuru gerektiren başka bir yerel çözüm JavaScriptSerializer'dir. Bu yeni bir değil, 3.5'ten beri orada çok bilinmeyen bir yerleşik özellik.

using System.Web.Script.Serialization;

..

JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());

ve geri

MyObject o = serializer.Deserialize<MyObject>(objectString)

2
Bu çok güzel, ancak web bileşenlerine ihtiyaç duyuyor, bu yüzden maalesef Windows XP için son .NET sürümü olan .NET 4.0 İstemci Profili'nde çalışmıyor. .NET'in tam kurulumu mümkündür, ancak birçok kişi yalnızca Müşteri Profili'ne sadık kalır. Buna karşılık, System.Runtime.Serialization.Json.DataContractJsonSerializer, İstemci Profilinde bile desteklenir.
Al Kepp

3
@ fr34kyn01535: Windows XP, masaüstünde en fazla ikinci pazar payına sahip. Alakalı.
DonkeyMaster

Nesnemi deseriarlize etmek için JavaScriptSerializer'ı kullandığımda işe yaradı, ancak tarihimi yanlış şekilde serileştirdi. 19.04.2018 12:00 olmalıdır ancak 18.04.2018 08: 00'da serileştirilmiş olmalıdır. NewtonSoft.Json.JsonConvert beklendiği gibi serisini kaldıracaktır.
Zengin


16

System.Json şimdi çalışıyor ...

Nuget'i yükleyin https://www.nuget.org/packages/System.Json

PM> Install-Package System.Json -Version 4.5.0

Örnek :

// PM>Install-Package System.Json -Version 4.5.0

using System;
using System.Json;

namespace NetCoreTestConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Note that JSON keys are case sensitive, a is not same as A.

            // JSON Sample
            string jsonString = "{\"a\": 1,\"b\": \"string value\",\"c\":[{\"Value\": 1}, {\"Value\": 2,\"SubObject\":[{\"SubValue\":3}]}]}";

            // You can use the following line in a beautifier/JSON formatted for better view
            // {"a": 1,"b": "string value","c":[{"Value": 1}, {"Value": 2,"SubObject":[{"SubValue":3}]}]}

            /* Formatted jsonString for viewing purposes:
            {
               "a":1,
               "b":"string value",
               "c":[
                  {
                     "Value":1
                  },
                  {
                     "Value":2,
                     "SubObject":[
                        {
                           "SubValue":3
                        }
                     ]
                  }
               ]
            }
            */

            // Verify your JSON if you get any errors here
            JsonValue json = JsonValue.Parse(jsonString);

            // int test
            if (json.ContainsKey("a"))
            {
                int a = json["a"]; // type already set to int
                Console.WriteLine("json[\"a\"]" + " = " + a);
            }

            // string test
            if (json.ContainsKey("b"))
            {
                string b = json["b"];  // type already set to string
                Console.WriteLine("json[\"b\"]" + " = " + b);
            }

            // object array test
            if (json.ContainsKey("c") && json["c"].JsonType == JsonType.Array)
            {
                // foreach loop test
                foreach (JsonValue j in json["c"])
                {
                    Console.WriteLine("j[\"Value\"]" + " = " + j["Value"].ToString());
                }

                // multi level key test
                Console.WriteLine("json[\"c\"][0][\"Value\"]" + " = " + json["c"][0]["Value"].ToString());
                Console.WriteLine("json[\"c\"][0][\"Value\"]" + " = " + json["c"][1]["Value"].ToString());
                Console.WriteLine("json[\"c\"][1][\"SubObject\"][0][\"SubValue\"]" + " = " + json["c"][1]["SubObject"][0]["SubValue"].ToString());
            }

            Console.WriteLine();
            Console.Write("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

1
Modern System.Json'un doğru bir şekilde nasıl kullanılacağına dair bir örnek bulmaya çalışmak, Json.NET/Newtonsoft.Json/"Newtson.Json "ve System.Json'un eski yinelemeleri için uzun zamandır kullanımdan kaldırıldıktan sonra beni buraya getirdi. Bunun için teşekkür ederim.
monkey0506

1
Bu bana çok yardımcı oldu. Çok teşekkür ederim.
MAK

10

Json'unuza dayalı bir sınıf oluşturmak için bu aracı kullanın:

http://json2csharp.com/

Ve sonra json'unuzun serisini kaldırmak için sınıfı kullanın. Misal:

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; set; }
}


string json = @"{
  'Email': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
}";

Account account = JsonConvert.DeserializeObject<Account>(json);

Console.WriteLine(account.Email);
// james@example.com

Referanslar: https://forums.asp.net/t/1992996.aspx?Nested+Json+Deserialization+to+C+object+and+using+that+object https://www.newtonsoft.com/json/help /html/DeserializeObject.htm


9

Aşağıdaki kodu deneyin:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");
JArray array = new JArray();
using (var twitpicResponse = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(twitpicResponse.GetResponseStream()))
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    var objText = reader.ReadToEnd();

    JObject joResponse = JObject.Parse(objText);
    JObject result = (JObject)joResponse["result"];
    array = (JArray)result["Detail"];
    string statu = array[0]["dlrStat"].ToString();
}

Teşekkürler, JSON.NET ile kolayca yapamayacağınız değişkenleri burada kullanmak istediğim için ["sonuç" + değişken] bölümünü istedim.
PHPGuru

Bu satır bir şey yapıyor mu ... JavaScriptSerializer js = new JavaScriptSerializer (); Şimdiden teşekkürler.
Chris Catignani

9

System.Text.Json

.NET çekirdek 3.0 ile geliyor System.Text.Jsonettiği yerleşik demektir yapabilirsiniz serisi kaldırılmaya / serialize JSON olmadan bir üçüncü taraf kitaplığı kullanarak.

Sınıflarınızı JSON dizesine serileştirmek için:

var json = JsonSerializer.Serialize(order);

JSON'un güçlü yazılan bir sınıfa serileştirilmesini kaldırmak için:

var order = JsonSerializer.Deserialize<Order>(json);

Yani aşağıdaki gibi bir sınıfınız varsa:

public class Order
{
    public int Id { get; set; }
    public string OrderNumber { get; set; }
    public decimal Balance { get; set; }
    public DateTime Opened { get; set; }
}

var json = JsonSerializer.Serialize(order);
// creates JSON ==>
{
    "id": 123456,
    "orderNumber": "ABC-123-456",
    "balance": 9876.54,
    "opened": "2019-10-21T23:47:16.85",
};

var order = JsonSerializer.Deserialize<Order>(json);
// ==> creates the above class

Nota bir şey olduğunu System.Text.Json gelmez otomatik işlemek camelCaseJSON özelliklerini kendi kodunuzu kullanırken (MVC / WebAPI istekleri ve model bağlayıcı kullanırken Ancak öyle).

Bunu çözmek JsonSerializerOptionsiçin parametre olarak geçmeniz gerekir .

JsonSerializerOptions options = new JsonSerializerOptions
{        
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,  // set camelCase       
    WriteIndented = true                                // write pretty json
};

// pass options to serializer
var json = JsonSerializer.Serialize(order, options);
// pass options to deserializer
var order = JsonSerializer.Deserialize<Order>(json, options);

System.Text.Json ayrıca .Net Framework ve .Net Standard için de Nu-get paketi olarak kullanılabilir System.Text.Json


1
Sınıfınız yoksa ne olacak? Ya sadece json verilerinin ne içereceğini belirsiz bir şekilde biliyorsanız? Ya da anahtarlar varsa?
Cherona

@Cherona kullanın JsonDocument.Parse.
haldo

5

Aşağıdaki msdn sitesinden aradığınız şey için bazı yerel işlevsellik sağlamaya yardımcı olduğunu düşünüyorum. Lütfen Windows 8 için belirtildiğini unutmayın. Siteden böyle bir örnek aşağıda listelenmiştir.

JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");

Windows.Data.JSON ad alanını kullanır .


6
Güzel, ancak "Minimum desteklenen istemci: Windows 8"
watbywbarif

onun artık desteklenen ve şimdi orada newtonsoft json dll olduğunu düşünüyorum icouldnt bulmak
windowss.data.json

3
@virtouso, watbywbarif'in aslında oldukça yeni olduğuna dikkat çekti, ancak Microsoft'tan asgari destek sadece Windows 8'de çalışıyor.
TargetofGravity

4

Aşağıdaki 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);
    } 
}

0

Sanırım gördüğüm en iyi cevap @MD_Sayem_Ahmed oldu.

Sorunuz "Json'u C # ile nasıl ayrıştırabilirim", ancak görünüşe göre Json'un kodunu çözmek istiyorsunuz. Kodunu çözmek istiyorsanız, Ahmed'in cevabı iyidir.

Bunu ASP.NET Web Api'de gerçekleştirmeye çalışıyorsanız, en kolay yol, atamak istediğiniz verileri içeren bir veri aktarım nesnesi oluşturmaktır:

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

Uygulama / json başlığını isteğinize eklemeniz yeterlidir (örneğin Fiddler kullanıyorsanız). Daha sonra bunu ASP.NET Web API'sinde aşağıdaki gibi kullanabilirsiniz:

//controller method -- assuming you want to post and return data
public MyDto Post([FromBody] MyDto myDto){
   MyDto someDto = myDto;
   /*ASP.NET automatically converts the data for you into this object 
    if you post a json object as follows:
{
    "Name": "SomeName",
      "Value": "SomeValue"
}
*/
   //do some stuff
}

Bu, Web API'mde çalışırken bana çok yardımcı oldu ve hayatımı çok kolaylaştırdı.


0
         string json = @"{
            'Name': 'Wide Web',
            'Url': 'www.wideweb.com.br'}";

        JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
        dynamic j = jsonSerializer.Deserialize<dynamic>(json);
        string name = j["Name"].ToString();
        string url = j["Url"].ToString();

-1
var result = controller.ActioName(objParams);
IDictionary<string, object> data = (IDictionary<string, object>)new System.Web.Routing.RouteValueDictionary(result.Data);
Assert.AreEqual("Table already exists.", data["Message"]);

2
Sadece bir kod satırı göndermek yerine çözümünüzü açıklamanız daha iyi olur. Sen okuyabilirsiniz İyi bir cevap yazmak nasıl .
Massimiliano Kraus

System.WebProje referanslarınıza dahil etmeyi unutmayın .
Ohad Cohen

-3
 using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(user)))
 {
    // Deserialization from JSON  
    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(UserListing))
    DataContractJsonSerializer(typeof(UserListing));
    UserListing response = (UserListing)deserializer.ReadObject(ms);

 }

 public class UserListing
 {
    public List<UserList> users { get; set; }      
 }

 public class UserList
 {
    public string FirstName { get; set; }       
    public string LastName { get; set; } 
 }
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.