आप एक जोबट में एक JToken को कैसे जोड़ते हैं?


84

मैं 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."

मैं वास्तव में कुछ अलग तरीकों की कोशिश की है, लेकिन कहीं भी प्राप्त करने के लिए प्रतीत नहीं कर सकते। मेरे उदाहरण में जो मैं वास्तव में करना चाहता हूं वह "फल" में नया आइटम जोड़ना है। कृपया मुझे बताएं कि क्या ऐसा करने का एक बेहतर तरीका या उपयोग करने के लिए एक सरल पुस्तकालय है।

जवाबों:


139

मुझे लगता है कि आप इस बारे में भ्रमित हो रहे हैं कि JSON.Net में क्या हो सकता है।

  • A JTokenकिसी भी प्रकार के JSON मूल्य का एक सामान्य प्रतिनिधित्व है। यह एक स्ट्रिंग, ऑब्जेक्ट, एरे, प्रॉपर्टी आदि हो सकता है।
  • A एक नाम के साथ जोड़ा गया JPropertyएकल JTokenमान है। इसे केवल एक में जोड़ा जा सकता है JObject, और इसका मान दूसरा नहीं हो सकता JProperty।
  • A 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 API संदर्भ ।
— ब्रायन रोजर्स

35

TL; DR: आपको एक जेबीप्रोजेक्ट को एक जोबजेक्ट में जोड़ना चाहिए। सरल। इंडेक्स क्वेरी JValue लौटाती है, इसलिए यह पता लगाएं कि JProperty कैसे प्राप्त करें?


स्वीकृत उत्तर प्रश्न का उत्तर नहीं दे रहा है जैसा कि लगता है। क्या होगा यदि मैं एक विशिष्ट के बाद विशेष रूप से एक जेपीरोपरि जोड़ना चाहता हूं? सबसे पहले, उन शब्दावली से शुरू करें जो वास्तव में मेरे सिर पर काम करती थीं।

  • जेटोकन = अन्य सभी प्रकार की माँ। यह एक JValue, JProperty, JArray, या जोबजेक्ट हो सकता है। यह पार्सिंग तंत्र को एक मॉड्यूलर डिजाइन प्रदान करना है।
  • JValue = किसी भी Json मूल्य प्रकार (स्ट्रिंग, इंट, बूलियन)।
  • JProperty = किसी भी JValue या JContainer (नीचे देखें) को एक नाम (पहचानकर्ता) के साथ जोड़ा गया । उदाहरण के लिए "name":"value"।
  • JContainer = सभी प्रकारों की माता जिसमें अन्य प्रकार (जोबजेक्ट, जेवल्यू) शामिल हैं।
  • जोबजेक्ट = एक जेकोनटेनर प्रकार जो JProperties का संग्रह रखता है
  • JArray = एक JContainer प्रकार जो एक संग्रह JValue या JContainer रखता है।

अब, जब आप इंडेक्स का उपयोग करके Json आइटम को क्वेरी करते हैं [], आपको पहचानकर्ता के बिना JToken मिल रहा है, जो JContainer या JValue (कास्टिंग की आवश्यकता है) हो सकता है, लेकिन आप इसके बाद कुछ भी नहीं जोड़ सकते, क्योंकि यह केवल एक मूल्य है। आप इसे स्वयं बदल सकते हैं, अधिक गहरे मूल्यों को क्वेरी कर सकते हैं, लेकिन उदाहरण के लिए इसके बाद आप कुछ भी नहीं जोड़ सकते।

आप वास्तव में क्या प्राप्त करना चाहते हैं वह सम्पूर्ण संपत्ति है, और फिर वांछित के बाद दूसरी संपत्ति जोड़ें। इसके लिए, आप उपयोग करते हैं JOjbect.Property("name"), और फिर अपनी इच्छा की एक और JProperty बनाते हैं और फिर इस उपयोग 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 संदर्भ ।
— ब्रायन रोजर्स

1
@BrianRogers धन्यवाद, मैंने शब्दावली तय की।
— घासन

1
यह न्यूटनसॉफ्ट ऑब्जेक्ट मॉडल की बहुत अच्छी व्याख्या है और मैं अब newtonsoft.com/json/help/html/N_Newtonsoft_Json_Linq.htm को बेहतर तरीके से समझ पा रहा हूं । अब तक इसका उपयोग करने के मेरे प्रयासों को डॉक्स में विस्तृत विवरण की कमी के कारण बाधित किया गया है। यह सिर्फ कोड टिप्पणियों से एक ऑटो-जनित संदर्भ प्रतीत होता है।
— टॉम विल्सन

2
हालांकि, कोड उदाहरण मॉड काफी सही नहीं है: `var foodJsonObj = JObject.Parse (jsonText); var bananaJson = JObject.Parse (@ "{" "color" ":" "yellow" "," "size" ":" "medium" "}"); var fruitJObject = foodJsonObj ["खाना"] ["फल"] जोबजेक्ट के रूप में; fruitJObject.Property ("नारंगी")। AddAfterSelf (नया JProperty ("केला", bananaJson)); `
— टॉम विल्सन

मैं मेरे जीवन के लिए मेरी पिछली टिप्पणी पर कोड मार्कअप लागू नहीं कर सकता - AARRGHH! मैंने वापस टिक्सेस और इंडेंट 4 रिक्त स्थान का उपयोग किया है - मैं इसे कैसे करूँ?
— टॉम विल्सन

5

बस .Firstअपने bananaTokenको जोड़ना चाहिए: इसे मूल रूप से एक के बजाय एक करने के लिए पिछले चलता है ।
foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken .First);
.First{JPropertyJToken

@ ब्रायन रोजर्स, धन्यवाद मैं भूल गया .Parent। संपादित

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.