न्यूटनसॉफ्ट (या LINQ से JSON शायद?) का उपयोग करके .NET ऑब्जेक्ट के लिए JSON का वर्णन करना?


318

मुझे पता है कि न्यूटनसॉफ्ट के बारे में कुछ पोस्ट हैं, इसलिए उम्मीद है कि यह बिल्कुल दोहराव नहीं है ... मैं KSONa के एपीआई द्वारा लौटाए गए JSON डेटा को किसी तरह की अच्छी वस्तु में बदलने की कोशिश कर रहा हूं

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString());

foreach (string item in list)
{
    Console.WriteLine(item);
}

//Console.WriteLine(reader.ReadLine());
stream.Close();

वह JsonConvert लाइन अभी हाल ही में एक है जो मैं कोशिश कर रहा था ... मैं इसे प्राप्त नहीं कर रहा हूं और आप लोगों से पूछकर कुछ फुटवर्क को खत्म करने की उम्मीद कर रहा था। मैं मूल रूप से इसे एक डिक्शनरी या किसी चीज़ में बदलने की कोशिश कर रहा था ... और वास्तव में, मुझे बस कुछ मूल्यों को टटोलने की ज़रूरत है, इसलिए दस्तावेज़ीकरण को देखते हुए, शायद न्यूटनसॉफ्ट का LINQ to JSON एक बेहतर विकल्प हो सकता है? विचार / लिंक?

यहां JSON रिटर्न डेटा का एक उदाहरण दिया गया है:

{
  "page": 1,
  "total_pages": 8,
  "total_entries": 74,
  "q": "muse",
  "albums": [
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "http://image.kazaa.com/images/69/01672812 1569/Yaron_Herman_Trio/Muse/Yaron_Herman_Trio-Muse_1.jpg",
      "id": 93098,
      "artist_name": "Yaron Herman Trio"
    },
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "htt p://image.kazaa.com/images/54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg",
      "i d": 102702,
      "artist_name": "\u76e7\u5de7\u97f3"
    },
    {
      "name": "Absolution",
      "permalink": " Absolution",
      "cover_image_url": "http://image.kazaa.com/images/65/093624873365/Mus e/Absolution/Muse-Absolution_1.jpg",
      "id": 48896,
      "artist_name": "Muse"
    },
    {
      "name": "Ab solution",
      "permalink": "Absolution-2",
      "cover_image_url": "http://image.kazaa.com/i mages/20/825646911820/Muse/Absolution/Muse-Absolution_1.jpg",
      "id": 118573,
      "artist _name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Black-Holes-An d-Revelations",
      "cover_image_url": "http://image.kazaa.com/images/66/093624428466/ Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1.jpg",
      "id": 48813,
      "artist_name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Bla ck-Holes-And-Revelations-2",
      "cover_image_url": "http://image.kazaa.com/images/86/ 825646911486/Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1 .jpg",
      "id": 118543,
      "artist_name": "Muse"
    },
    {
      "name": "Origin Of Symmetry",
      "permalink": "Origin-Of-Symmetry",
      "cover_image_url": "http://image.kazaa.com/images/29/825646 912629/Muse/Origin_Of_Symmetry/Muse-Origin_Of_Symmetry_1.jpg",
      "id": 120491,
      "artis t_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz",
      "cover_image_url": "http: //image.kazaa.com/images/68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg",
      "id": 60444,
      "artist_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz-2",
      "cover_imag e_url": "http://image.kazaa.com/images/50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg",
      "id": 118545,
      "artist_name": "Muse"
    },
    {
      "name": "The Resistance",
      "permalink": "T he-Resistance",
      "cover_image_url": "http://image.kazaa.com/images/36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg",
      "id": 121171,
      "artist_name": "Muse"
    }
  ],
  "per_page": 10
}

मैंने कुछ और पढ़ा और न्यूटनसॉफ्ट की LINQ को JSON में पाया, ठीक वैसा ही जैसा मैं चाहता था ... WebClient, Stream, StreamReader, और Newtonsoft का उपयोग ... मैं JSON डेटा के लिए Kazaa को हिट कर सकता हूं, एक URL निकाल सकता हूं, फ़ाइल डाउनलोड कर सकता हूं, और कर सकता हूं। कोड की सात लाइनों की तरह सभी! मुझे यह पसंद है।

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());

// Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file
Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]);
stream.Close();

इस पोस्ट को बहुत सारे हिट मिले मैंने सोचा कि टिप्पणियों में चर्चा की गई "बिट्स" का उपयोग करना शामिल करना सहायक हो सकता है।

using(var client = new WebClient())
using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]);
}

6
स्लीक उदाहरण, धन्यवाद। बस एक सुझाव: आप इसे संक्षिप्तता के लिए छोड़ सकते हैं, लेकिन चूंकि WebClient, Streamऔर StreamReaderसभी लागू होते हैं IDisposable, आप usingअपने कोड में कुछ ब्लॉक जोड़ना चाह सकते हैं ।
धनु

आह हाँ, अच्छा कॉल ... (हाँ यह वास्तव में सिर्फ एक कंसोल ऐप था जो मैं अपने द्वारा किए जा रहे कार्यों के लिए शोध करने के लिए वास्तविक त्वरित चला रहा था) अब पहेली के अंतिम टुकड़े, एचएलएस + एईएस एन्क्रिप्शन :) यूजी पर शोध करने के लिए बंद ... लोल
जे बेंजामिन

1
+1 लाइनक उदाहरण पोस्ट करने के लिए धन्यवाद। बिल्कुल वही जो मुझे चाहिए था।
मार्क विल्किंस

क्या न्यूटनसॉफ्ट सॉल्यूशन जेएसएन को पूरी तरह से निष्क्रिय नहीं करता है? जैसे @ आचमन का उपाय करते हैं।
AXMIM

यहाँ लिंक पर ध्यान दें: LINQ to JSON
yu yang Jian

जवाबों:


259

अगर आपको सिर्फ JSON ऑब्जेक्ट से कुछ आइटम प्राप्त करने की आवश्यकता है, तो मैं JSON.NET की LINQ से JSON JObjectक्लास का उपयोग करूंगा । उदाहरण के लिए:

JToken token = JObject.Parse(stringFullOfJson);

int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");

मुझे यह तरीका पसंद है क्योंकि आपको JSON ऑब्जेक्ट को पूरी तरह से डीसर्विलाइज़ करने की आवश्यकता नहीं है। यह एपीआई के साथ काम आता है जो कभी-कभी आपको ट्विटर जैसी लापता वस्तु गुणों से आश्चर्यचकित कर सकता है।

दस्तावेज़ीकरण: JSON के साथ JSON.NET और LINQ के साथ JSON को सीरियलाइज़ करना और वर्णन करना


1
फिर मैं वास्तव में थोड़ा और अधिक पढ़ने और परीक्षण कर चुका हूं ... इसे ऐसा करने का एक अच्छा तरीका मिला ... न्यूटांसॉफ्ट, बहुत अच्छा पुस्तकालय, मैं दूसरों के लिए अपना उदाहरण पोस्ट करूंगा
जे बेंजामिन

1
मैं कैसे कर रहा था, इसका एक मोटा उदाहरण पोस्ट किया है ... बिल्कुल वैसा ही नहीं, मैं आपको JToken.Parse का सुझाव देता हूं ... दोनों के बीच मतभेदों के बारे में निश्चित नहीं हूं लेकिन फिर भी, अच्छा सामान!
जे बेंजामिन

1
@Jjjamin धन्यवाद! वह एक टाइपो था। जोकजे जोबजेक्ट के लिए आधार वर्ग है, और अधिक सार प्रकार के साथ काम करना मेरी व्यक्तिगत प्राथमिकता है। मेरा ध्यान है कि फोन करने के लिए धन्यवाद।
18

क्षमा करें, लेकिन क्या यह जोकेन, या जोबजेक्ट होना चाहिए? उपरोक्त कोड अभी भी हर बार "एरर रीडिंग जेजबजेक्ट फ्रॉम जौनसियर" त्रुटि को फेंक रहा है।
१३:१५

1
@ टायरोन श्योर, नो प्रॉब्लम। मैं वास्तव में ट्विटर की स्थिति को पार्स करने के लिए इस कोड का उपयोग करता हूं, और मुझे ट्विटर पर कॉल के आसपास होने वाली त्रुटि को लिखने में काफी मुश्किल हुई है क्योंकि वे कई बार धब्बेदार हो सकते हैं। यदि आप पहले से ही ऐसा नहीं कर रहे हैं, तो मैं इसे पार्स करने का प्रयास करने से पहले ट्विटर से कच्चे JSON प्रतिक्रिया को लॉग में डंप करने की सलाह दूंगा। फिर अगर यह विफल हो जाता है, तो आप कम से कम देख सकते हैं कि क्या आपको तार पर कुछ कायरता मिली है।
आर्क

272

आप dynamicचीजों को आसान बनाने के लिए C # प्रकार का उपयोग कर सकते हैं । यह तकनीक री-फैक्टरिंग को भी सरल बनाती है क्योंकि यह जादू-टोने पर निर्भर नहीं करता है।

JSON

नीचे दी गई JSON स्ट्रिंग HTTP API कॉल की सरल प्रतिक्रिया है, और यह दो गुणों को परिभाषित करती है: Idऔर Name

{"Id": 1, "Name": "biofractal"}

सी#

JsonConvert.DeserializeObject<dynamic>()इस स्ट्रिंग को डायनेमिक प्रकार में डिसेरिएलाइज़ करने के लिए उपयोग करें और फिर इसके गुणों को सामान्य तरीके से एक्सेस करें।

dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;

यदि आप कीवर्ड का उपयोग करने के बजाय resultsचर के प्रकार को निर्दिष्ट करते हैं , तो संपत्ति मान सही ढंग से डिस्क्रिअलाइज़ करेंगे, उदाहरण के लिए ए और नहीं (नीचे टिप्पणी के लिए GFoley83 के लिए धन्यवाद)।dynamicvarIdintJValue

नोट : न्यूटनसॉफ्ट असेंबली के लिए NuGet लिंक http://nuget.org/packages/newtonsoft.json है

पैकेज : आप पैकेज को नगेट लाइव इंस्टॉलर के साथ भी जोड़ सकते हैं, अपनी परियोजना के साथ, बस ब्राउज़ पैकेज खोलें और फिर बस इसे इंस्टॉल करें, अनइस्टॉल करें, अपडेट करें , यह सिर्फ डिपेंडेंसी / NuGet के तहत आपके प्रोजेक्ट में जोड़ा जाएगा


मैं ऊपर के रूप में कोड के एक ही टुकड़े का उपयोग कर रहा था ताकि newtonsoft.dll संस्करण 4.5.6 के साथ ट्विटर प्रतिक्रिया को निष्क्रिय किया जा सके और यह ठीक काम कर रहा था..लेकिन इसे 5.0.6 संस्करण में अपडेट करने के बाद .. यह त्रुटि फेंकने लगा ... कोई भी विचार क्यों ??
प्रणव

1
डायनेमिक ऑब्जेक्ट के लिए अच्छा है, जब हम जानते हैं या हमारे पास सी # क्लास है इसलिए हम डायनामिक की जगह पर सी # क्लास के रूप में उपभोग कर सकते हैं।
MSTdev

2
dynamic results = JsonConvert.DeserializeObject<ExpandoObject>(json);यहां FTW का उपयोग करें। यह सही ढंग Idसे एक interialize होगा और नहीं एक JValue। यहां देखें: dotnetfiddle.net/b0WxGJ
GFoley83

@Bofractal मैं dynamic results = JsonConvert.DeserializeObject<dynamic>(json); VB.NET में यह कैसे करूँगा ? Dim results As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(json)काम नहीं करता।
फ़्लो


41

dynamicकीवर्ड के साथ , इस तरह की किसी भी वस्तु को पार्स करना वास्तव में आसान हो जाता है:

dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
var page = x.page;
var total_pages = x.total_pages
var albums = x.albums;
foreach(var album in albums)
{
    var albumName = album.name;

    // Access album data;
}

मैं जानना चाहता था कि परिणामों के माध्यम से कैसे लूप किया जाए और इसे खोजने में बहुत लंबा समय लगा ... धन्यवाद !!
बैटफॉफेल

22

अगर मुझसे गलती हुई है तो मुझे सुधारो, लेकिन पिछले उदाहरण, मेरा मानना ​​है कि, जेम्स न्यूटन के Json.NET लाइब्रेरी के नवीनतम संस्करण के साथ सिंक से थोड़ा बाहर है।

var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];

1
आपकी प्रतिक्रिया रिक के लिए धन्यवाद, हां जो उन उदाहरणों से मिलता-जुलता है जो मुझे हाल ही के दस्तावेज़ों में भी मिले थे।
जे बेंजामिन

1
हाँ, जब से आर्कैन ने टाइपो को ठीक किया है, मेरी टिप्पणी अब सिर्फ नाइटपिक दिखती है: '(! मैं मूल रूप से इसलिए पोस्ट किया क्योंकि मैं JToken.Parse को पहचान नहीं पाया।
रिक लीच

1
बिल्कुल भी नाइटपिक नहीं - निश्चित रूप से एक गलती थी, और हमेशा ऐसा करने का एक से अधिक तरीका है। वैसे, Json.NET का मेरा संस्करण अनुक्रमणिका पर अनुक्रमणिका का उपयोग करके वाक्यविन्यास का समर्थन करता है JObject, लेकिन मेरे उत्तर के लिए मैंने जो कोड संशोधित किया था, वह कोड को SelectTokenविधि के अधिभार के उपयोग से खींच लिया गया था, इसलिए यदि टोकन नहीं था तो मैं अपवादों को दबा सकता था। मिल गया:JToken JToken.SelectToken(string tokenName, bool errorWhenNoMatch) तो यह है कि जहां से वाचालता आया था।
धनु

18

अगर, मेरी तरह, आप दृढ़ता से टाइप की गई वस्तुओं से निपटना पसंद करते हैं

MyObj obj =  JsonConvert.DeserializeObject<MyObj>(jsonString);

इस तरह आपको इन्टेलिसेन्स का उपयोग करने और टाइम टाइप एरर चेक करने का संकलन मिलता है।

आप अपने JSON को मेमोरी में कॉपी करके और इसे JSON ऑब्जेक्ट्स के रूप में पेस्ट करके आसानी से आवश्यक ऑब्जेक्ट बना सकते हैं (विजुअल स्टूडियो -> एडिट -> पेस्ट स्पेशल -> क्लास के रूप में JSON पेस्ट करें)।

यहाँ देखें कि क्या आपके पास Visual Studio में वह विकल्प नहीं है।

आपको यह भी सुनिश्चित करना होगा कि आपका JSON वैध है। शुरुआत में अपनी खुद की वस्तु जोड़ें अगर यह वस्तुओं का एक सरणी है। यानी { "obj": [{}, {}, {}]}

** मुझे पता है कि गतिशील चीजों को कभी-कभी आसान बना देता है लेकिन मैं इसके साथ थोड़ा सा ऑलकूल हूं।


1
बहुत मेरा पसंदीदा प्रोग्रामिंग के लिए संपर्क किया। मुझे मजबूत टाइप की हुई चीजें पसंद हैं। धन्यवाद, मैंने इस कोड का उपयोग किया और संशोधित किया।
j.hull

11

डायनेमिक लिस्ट लूज़ली टाइप्ड - डिस्क्रिअलाइज़ करें और वैल्यूज़ पढ़ें

// First serializing
dynamic collection = new { stud = stud_datatable }; // The stud_datable is the list or data table
string jsonString = JsonConvert.SerializeObject(collection);


// Second Deserializing
dynamic StudList = JsonConvert.DeserializeObject(jsonString);

var stud = StudList.stud;
foreach (var detail in stud)
{
    var Address = detail["stud_address"]; // Access Address data;
}

8

मुझे यह तरीका पसंद है:

using Newtonsoft.Json.Linq;
// jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

अब आप dictObjडिक्शनरी के रूप में उपयोग करके अपनी इच्छित किसी भी चीज़ तक पहुँच सकते हैं । आप भी उपयोग कर सकते हैंDictionary<string, string>यदि आप स्ट्रिंग्स के रूप में मान प्राप्त करना पसंद करते तो आप हैं।

आप इस विधि का उपयोग किसी भी प्रकार के .NET ऑब्जेक्ट के रूप में करने के लिए कर सकते हैं।


2
मुझे यह विधि दो कारणों से बहुत अच्छी लगती है: 1) जब आप डेटा प्रकार (सब कुछ स्ट्रिंग है) के बारे में परवाह नहीं करते हैं, और 2) यह मूल्यों के शब्दकोश के साथ काम करने के लिए सुविधाजनक है
netfed

7

इसके अलावा, यदि आप JSON सामग्री के भीतर किसी विशिष्ट मान के लिए देख रहे हैं, तो आप ऐसा कुछ कर सकते हैं:

yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");

और इतने पर वहाँ से।

यदि आप संपूर्ण JSON को C # ऑब्जेक्ट में परिवर्तित करने की लागत को वहन नहीं करना चाहते हैं तो यह मदद कर सकता है।


2

मैं json के लिए एक एक्सियनक्लास तरस गया:

 public static class JsonExtentions
    {
        public static string SerializeToJson(this object SourceObject) { return Newtonsoft.Json.JsonConvert.SerializeObject(SourceObject); }


        public static T JsonToObject<T>(this string JsonString) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject<T>(JsonString); }
}

डिज़ाइन पैटर्न:

 public class Myobject
    {
        public Myobject(){}
        public string prop1 { get; set; }

        public static Myobject  GetObject(string JsonString){return  JsonExtentions.JsonToObject<Myobject>(JsonString);}
        public  string ToJson(string JsonString){return JsonExtentions.SerializeToJson(this);}
    }

उपयोग:

   Myobject dd= Myobject.GetObject(jsonstring);

                 Console.WriteLine(dd.prop1);


1

इस पार्टी के लिए देर से ही सही, लेकिन मैं इस मुद्दे पर आज काम पर आया। यहां बताया गया है कि मैंने इस मुद्दे को कैसे हल किया।

मैं पुस्तकों की एक सूची को पुनः प्राप्त करने के लिए एक 3 पार्टी एपीआई का उपयोग कर रहा था। ऑब्जेक्ट ने एक विशाल JSON ऑब्जेक्ट लौटाया, जिसमें लगभग 20+ फ़ील्ड थे, जिनमें से मुझे केवल सूची स्ट्रिंग ऑब्जेक्ट के रूप में आईडी की आवश्यकता थी। मैंने जिस गतिशील क्षेत्र की आवश्यकता है उसे पुनः प्राप्त करने के लिए गतिशील वस्तु पर linq का उपयोग किया और फिर इसे मेरी सूची स्ट्रिंग ऑब्जेक्ट में डाला।

dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();

List<string> codes = new List<string>();

foreach (var code in contentCodes)
{
    codes.Add(code?.ToString());
}

0

अंत में JSON से राज्य का नाम प्राप्त करें

धन्यवाद!

Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.collections.generic

Public Module Module1
    Public Sub Main()

         Dim url As String = "http://maps.google.com/maps/api/geocode/json&address=attur+salem&sensor=false"
            Dim request As WebRequest = WebRequest.Create(url)
        dim response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
        dim reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
          Dim dataString As String = reader.ReadToEnd()

        Dim getResponse As JObject = JObject.Parse(dataString)

        Dim dictObj As Dictionary(Of String, Object) = getResponse.ToObject(Of Dictionary(Of String, Object))()
        'Get State Name
        Console.WriteLine(CStr(dictObj("results")(0)("address_components")(2)("long_name")))
    End Sub
End Module
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.