আমি কোন জবজেক্টের মাধ্যমে কীভাবে গণনা করব?


111

আমি আমার জবজেক্টে থাকা ডেটাটি কীভাবে অ্যাক্সেস করব তা নির্ধারণ করার চেষ্টা করছি এবং কীভাবে এটি ব্যবহার করব তা নির্ধারণ করার জন্য আমি আমার জীবনের পক্ষে পারি না।

JObject Object = (JObject)Response.Data["my_key"];

আমি এটিকে কনসোল দিয়ে মুদ্রণ করতে পারি W রাইটলাইন (অবজেক্ট) এবং আমি ডেটা দেখতে পাচ্ছি, দেখে মনে হচ্ছে:

{
 "my_data" : "more of my string data"
...
}

তবে এর মাধ্যমে কীভাবে কেবল পুনরাবৃত্তি / গণনা করা যায়, আমার কোনও ধারণা নেই, কারও কোনও ধারণা আছে? আমি এখনই এমন ক্ষতি করছি at

উত্তর:


167

আপনি যদি ডকুমেন্টেশনেরJObject দিকে নজর দেন তবে আপনি দেখতে পাবেন এটি কার্যকর করে IEnumerable<KeyValuePair<string, JToken>>। সুতরাং, আপনি কেবল এটি ব্যবহার করে এটির উপরে পুনরাবৃত্তি করতে পারেন foreach:

foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    
}

3
এটি সঠিক, তবে যে কারণে আমি বুঝতে পারি না, আপনি লিনকের সাথে এটি ব্যবহার করতে পারবেন না যদি আপনি পরিষ্কারভাবে গণনাযোগ্য প্রকারে না ফেলে থাকেন। অর্থাৎ আপনি ((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)সরল-পুরানো পরিবর্তে obj.Select(...); বা কমপক্ষে এটি আমার কোডের একটি অংশ খুঁজে পেয়েছি।
অ্যাড্রিয়ান রত্নপাল

2
@ অ্যাড্রিয়ানরত্নপাল আপনার আপত্তিটি কি গতিশীল বলে ঘোষণা করা হয়েছে? এক্সটেনশন পদ্ধতি (যেমন এনুম্যুয়াল.সलेक्ट নির্বাচন করুন) এর সাথে কাজ করে না।
সুইভ

1
না, আমার ক্ষেত্রে objটাইপ ছিল JObject; তবে JObjectএকই ধরণের সমস্যা আছে বলে মনে হয় dynamic। সংকলকটি প্রকারের আর্গুমেন্টগুলিতে অনুমান করতে পারে না .Select। আমি তাদের স্পষ্টভাবে দিতে পারি, obj.Select<KeyValuePair<string, JToken>, (result type)>(...)আমার জন্যও কাজ করে
অ্যাড্রিয়ান রত্নপালা

3
@ অ্যাড্রিয়ানরত্নপাল হুম, আপনি ঠিক বলেছেন এটি কারণ এবং JObjectউভয়ই প্রয়োগ করে (পরোক্ষভাবে )) IEnumerable<KeyValuePair<string, JToken>>IEnumerable<JToken>JContainer
সোভিক

3
এখন আমি কীভাবে এটি নেস্টেড জেএসওএন-এর জন্য ব্যবহার করব? উদাহরণস্বরূপ, যদি "মান" তে কী এর আরও একটি সেট থাকে: মান জোড়, আমি কীভাবে JToken valueজোড়গুলির পরবর্তী সেটের মাধ্যমে পুনরাবৃত্তি করতে পারি ?
অ্যালবাট্রসকাফে

53

JObjects মাধ্যমে গণিত যাবে JProperty একটি এটি কাস্ট করে বস্তু JToken :

foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject
    string name = x.Name;
    JToken value = x.Value;
}

যদি আপনার অন্য জবজেক্টের ভিতরে নেস্টেড জবজেক্ট থাকে তবে আপনাকে কাস্ট করার দরকার নেই কারণ অ্যাক্সেসর একটি জে টোকেনকে ফিরিয়ে দেবে:

foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects
    string name = x.Name;
    JToken value = x.Value;
}

3
এছাড়াও আপনি সুবিধামত তাই মত linq ব্যবহার করতে পারেন: obj.Properties().Select(p => p.Name + ": " + p.Value)
#littlejohn

এটি হ'ল আমি অনুসন্ধান করছিলাম। তোমাকে অনেক ধন্যবাদ!
ঝুপ্পে

15

উত্তরটি আমার পক্ষে কার্যকর হয়নি। আমি জানি না কীভাবে এটি এত বেশি ভোট পেয়েছে। যদিও এটি আমাকে একটি দিক নির্দেশ করতে সহায়তা করেছিল।

এই উত্তরটি আমার পক্ষে কাজ করেছে:

foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}

1
তার সাথে (এই লাইনের পরে: জবজেক্ট দাম কমপ্লেশনজেসন = জবজেক্ট.পার্স (ফাইল.আরেডআলটেক্সট (ফুলপথ));) আমি পেয়েছি, "সিস্টেম.কলেশনস.জেনেরিক.কি.ভ্যালিউপায়ার <স্ট্রিং, নিউটোনসফট.জসন.লিনকি.জেটোকেন> 'রূপান্তর করতে পারবেন না।' to 'Newtonsoft.Json.Linq.JProperty' "কাস্টিং অপসারণ কাজ করছে, যদিও: var কী = x.Key; var jvalue = x.Value; - কমপক্ষে এটি সংকলন করে ... আমি আগামীকাল কার্যকারিতাটি পরীক্ষা করব।
বি ক্লে শ্যানন

3

আমার মতো লোকদের জন্য, লিনিক আসক্তি এবং এসভিকের উত্তরের উপর ভিত্তি করে , এখানে একটি লিনাক পদ্ধতির:

using System.Linq;
//...
//make it linq iterable. 
var obj_linq = Response.Cast<KeyValuePair<string, JToken>>();

এখন আপনি লিনাকের মত প্রকাশ করতে পারেন:

JToken x = obj_linq
          .Where( d => d.Key == "my_key")
          .Select(v => v)
          .FirstOrDefault()
          .Value;
string y = ((JValue)x).Value;

বা শুধু:

var y = obj_linq
       .Where(d => d.Key == "my_key")
       .Select(v => ((JValue)v.Value).Value)
       .FirstOrDefault();

বা এই সমস্ত ডেটা পুনরাবৃত্তি করতে:

obj_linq.ToList().ForEach( x => { do stuff } ); 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.