কীভাবে আপনি একটি জবজেক্টে জে টোকেন যুক্ত করবেন?


86

আমি JSON.Net ব্যবহার করে একটি বিদ্যমান JSON ফাইলটিতে কিছু পাঠ্য থেকে একটি JSON অবজেক্ট যুক্ত করার চেষ্টা করছি। উদাহরণস্বরূপ যদি আমার কাছে নীচে JSON ডেটা থাকে:

  {
  "food": {
    "fruit": {
      "apple": {
        "colour": "red",
        "size": "small"
      },
      "orange": {
        "colour": "orange",
        "size": "large"
      }
    }
  }
}

আমি এইভাবে এটি করার চেষ্টা করছি:

var foodJsonObj = JObject.Parse(jsonText);
var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");
var bananaToken = bananaJson as JToken;
foodJsonObj["food"]["fruit"]["orange"].AddAfterSelf(bananaToken);

তবে এটি ত্রুটি দেয়: "Newtonsoft.Json.Linq.JProperty cannot have multiple values."

আমি আসলে কয়েকটি ভিন্ন উপায়ে চেষ্টা করেছি তবে কোথাও পাবে বলে মনে হচ্ছে না। আমার উদাহরণে আমি যা করতে চাই তা হ'ল নতুন ফলের সাথে "ফল" যুক্ত করা। এটি করার আরও ভাল উপায় বা ব্যবহারের জন্য একটি সহজ লাইব্রেরি থাকলে দয়া করে আমাকে জানান।

উত্তর:


143

আমি মনে করি আপনি JSON.Net এ কী ধারণ করতে পারবেন সে সম্পর্কে বিভ্রান্ত হয়ে পড়ছেন।

  • এ JTokenহ'ল কোনও প্রকারের JSON মানের জেনেরিক উপস্থাপনা। এটি স্ট্রিং, অবজেক্ট, অ্যারে, সম্পত্তি ইত্যাদি হতে পারে
  • এ নামের সাথে যুক্ত JPropertyএকক JTokenমান। এটি কেবল JObjectএকটিতে যুক্ত করা যেতে পারে এবং এর মান অন্যটি হতে পারে না JProperty।
  • ক JObjectএকটি সংগ্রহ JProperties। এটি অন্য কোনও ধরণের JTokenসরাসরি ধরে রাখতে পারে না ।

আপনার কোডটিতে, আপনি একটি JObject("কলা" ডেটা সম্বলিত একটি) একটি JProperty("কমলা") এর সাথে যুক্ত করার চেষ্টা করছেন যা ইতিমধ্যে একটি মান (একটি JObjectসমন্বিত {"colour":"orange","size":"large"}) রয়েছে। যেমনটি আপনি দেখেছেন, এর ফলে একটি ত্রুটি ঘটবে।

আপনি যা করতে চান তা হ'ল একটি JProperty"কলা" যুক্ত করুন JObjectযা অন্য ফল ধারণ করে JProperties। সংশোধিত কোডটি এখানে:

JObject foodJsonObj = JObject.Parse(jsonText);
JObject fruits = foodJsonObj["food"]["fruit"] as JObject;
fruits.Add("banana", JObject.Parse(@"{""colour"":""yellow"",""size"":""medium""}"));

7
দ্রষ্টব্য: JObject.Parseশেষ লাইনে 'JToken.Parse' (বা 'JToken.FromObject') ব্যবহার করুন। এটি স্ট্রিংয়ের মতো সাধারণ বস্তুর জন্যও কাজ করে।
— ctrl-alt-delor

আমি যদি কোনও Jproperty ওভাররাইট করতে চাই তবে কী করব।
— ড্যানিয়েল

@ ড্যানিয়েল - যদি "ওভাররাইট" দ্বারা আপনি সম্পূর্ণ ভিন্নটিকে JPropertyআলাদা করে প্রতিস্থাপন করতে চান তবে আপনি Replaceপদ্ধতিটি ব্যবহার করতে পারেন । আপনি যদি কেবল এর মান পরিবর্তন করতে চান তবে আপনি এটিতে সম্পত্তি JPropertyসেট করতে পারেন Value; এটি লেখার যোগ্য। দেখুন LINQ টু তাদেরকে JSON এপিআই রেফারেন্স ।
— ব্রায়ান রজার্স

37

টিএল; ডিআর: আপনার একটি জেবজেটে জেপ্রোপার্টি যুক্ত করা উচিত। সরল। সূচক ক্যোয়ারী একটি জেভালুকে রিটার্ন দেয়, সুতরাং পরিবর্তে কীভাবে জেপ্রোপার্টি পাবেন তা নির্ধারণ করুন :)


গৃহীত উত্তর প্রশ্নের উত্তর যেমন মনে হচ্ছে তেমন উত্তর দিচ্ছে না। আমি যদি কোনও নির্দিষ্টটির পরে জেপ্রোপার্টি বিশেষভাবে যুক্ত করতে চাই তবে কী হবে? প্রথমত, পরিভাষা দিয়ে শুরু করা যাক যা সত্যই আমার মাথা পর্যন্ত কাজ করেছিল।

  • জে টোকেন = অন্য সকল ধরণের মা। এটি একটি জেভালিউ, জেপ্রোপার্টি, জেআরাই বা জওবজেক্ট হতে পারে। এটি পার্সিং মেকানিজমকে একটি মডুলার ডিজাইন সরবরাহ করা।
  • জেভালিউ = যে কোনও জসন মান প্রকার (স্ট্রিং, ইনট, বুলিয়ান)।
  • জেপ্রোপার্টি = কোনও জেভালু বা জে কন্টেইনার (নীচে দেখুন) নামের (শনাক্তকারী) সাথে যুক্ত । উদাহরণস্বরূপ "name":"value"।
  • জে কনটেনার = অন্যান্য ধরণের (JObject, JValue) ধারণ করে এমন সমস্ত ধরণের জননী।
  • JObject = একটি JContainer প্রকার যা JProperties এর সংকলন ধারণ করে
  • JArray = একটি JContainer প্রকার যা JValue বা JContainer সংগ্রহ করে।

এখন, আপনি যখন সূচকটি ব্যবহার করে জসন আইটেমটি অনুসন্ধান করেন [], আপনি শনাক্তকারী ছাড়াই জটোকেন পাচ্ছেন, যা জে কনটেনার বা জেভালিউ হতে পারে (কাস্টিং প্রয়োজন) তবে আপনি এর পরে আর কিছু যুক্ত করতে পারবেন না কারণ এটি কেবলমাত্র একটি মূল্য। আপনি এটি নিজেই পরিবর্তন করতে পারবেন, আরও গভীর মানগুলি জিজ্ঞাসা করতে পারেন, তবে উদাহরণস্বরূপ আপনি এর পরে আর কিছু যুক্ত করতে পারবেন না।

আপনি প্রকৃতপক্ষে যা পেতে চান তা হ'ল সম্পদ এবং তারপরে এটির পরে অন্য সম্পত্তি যুক্ত করুন। এর জন্য, আপনি ব্যবহার করুন JOjbect.Property("name")এবং তারপরে আপনার ইচ্ছার আর একটি জেপ্রোপার্টি তৈরি করুন এবং তারপরে এটি AddAfterSelfপদ্ধতি ব্যবহার করে যুক্ত করুন । আপনি তখন সম্পন্ন হয়।

আরও তথ্যের জন্য: http://www.newtonsoft.com/json/help/html/ModifyJson.htm

এটি আমি সংশোধিত কোড।

public class Program
{
  public static void Main()
  {
    try
    {
      string jsonText = @"
      {
        ""food"": {
          ""fruit"": {
            ""apple"": {
              ""colour"": ""red"",
              ""size"": ""small""
            },
            ""orange"": {
              ""colour"": ""orange"",
              ""size"": ""large""
            }
          }
        }
      }";

      var foodJsonObj = JObject.Parse(jsonText);
      var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");

      var fruitJObject = foodJsonObj["food"]["fruit"] as JObject;
      fruitJObject.Property("orange").AddAfterSelf(new JProperty("banana", fruitJObject));

      Console.WriteLine(foodJsonObj.ToString());
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
    }
  }
}

4
আপনি আপনার পরিভাষা ভুল পেয়েছেন। JToken(না JValue) বেস বর্গ যা থেকে JArray, JObject, JPropertyএবং JValueপরিণামে উত্তরাধিকারী। JValueএকটি JSON আদিম যা স্ট্রিং, সংখ্যা, বুলিয়ান, তারিখ বা নাল মান উপস্থাপন করে; এটি কোনও অ্যারে বা বস্তুর প্রতিনিধিত্ব করতে পারে না। দেখুন LINQ টু তাদেরকে JSON API উল্লেখ ।
— ব্রায়ান রজার্স 14

4
@ ব্রায়ানরোগার্স ধন্যবাদ, আমি পরিভাষাটি স্থির করেছি।
— ঘাসন

4
এটি নিউটোনসফট অবজেক্ট মডেলের একটি খুব ভাল ব্যাখ্যা এবং আমি এখন আরও ভাল আরও বুঝতে পেরেছি এখন পর্যন্ত ডকসগুলিতে বিশদ ব্যাখ্যার অভাবে এটি ব্যবহারের আমার প্রচেষ্টা ব্যাহত হয়েছে। এটি কেবল কোড মন্তব্য থেকে একটি স্বয়ংক্রিয় উত্পন্ন রেফারেন্স বলে মনে হচ্ছে।
— টম উইলসন

4
তবে কোড উদাহরণ মোড একেবারেই সঠিক নয়: food var foodJsonObj = JObject.Parse (jsonText); var কলাজেসন = জবজেক্ট.পার্স (@ "" {"" রঙ "": "" হলুদ "", "" আকার "": "" মাঝারি ""} "); var fruitJObject = foodJsonObj ["খাবার"] ["ফল"] জোবজেক্ট হিসাবে; ফলজবজেক্ট.প্রোপার্টি ("কমলা")। অ্যাডএফটারসেলফ (নতুন জেপ্রোপার্টি ("কলা", কলা জেসন)); `
— টম উইলসন

আমি আমার জীবনের জন্য আমার আগের মন্তব্যে কোড মার্কআপ প্রয়োগ করতে পারি না - আআআআআআরআরজিএইচ! আমি পিছনে টিক্স ব্যবহার করেছি এবং 4 টি ফাঁকা স্থান ব্যবহার করেছি - আমি কীভাবে এটি করব?
— টম উইলসন

5

শুধু যোগ .Firstকরার জন্য আপনার bananaTokenএটা করতে হবে: মূলত গত চলে আসে এটি একটি করতে একটি পরিবর্তে ।
foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken .First);
.First{JPropertyJToken

@Brian রজার্স, ধন্যবাদ আমি ভুলে গেছি .Parent। সম্পাদিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.