web-dev-qa-db-fra.com

Ajouter JObject à JObject

J'ai une structure json comme celle-ci:

var json = 
{
  "report": {},
  "expense": {},
  "invoices": {},
  "projects": {},
  "clients": {},
  "settings": {
    "users": {},
    "companies": {},
    "templates": {},
    "translations": {},
    "license": {},
    "backups": {},
  }
}

Je voudrais ajouter un nouvel objet vide comme "report": {} au json

Mon code C # est comme ceci:

JObject json = JObject.Parse(File.ReadAllText("path"));
json.Add(new JObject(fm.Name));

Mais cela me donne une exception: impossible d'ajouter Newtonsoft.Json.Linq.JValue à Newtonsoft.Json.Linq.JObject

Alors, comment puis-je ajouter un JObject nouveau et vide au json

Merci d'avance

13
DoobieAsDave

Vous obtenez cette erreur car vous essayez de construire un JObject avec une chaîne (qui est convertie en JValue). Un JObject ne peut pas contenir directement un JValue, ni un autre JObject, d'ailleurs; il ne peut contenir que JProperties (qui peut, à son tour, contenir d'autres JObjects, JArrays ou JValues).

Pour le faire fonctionner, changez votre deuxième ligne en ceci:

json.Add(new JProperty(fm.Name, new JObject()));

Démo de travail: https://dotnetfiddle.net/cjtoJn

17
Brian Rogers

Un autre exemple

var jArray = new JArray {
    new JObject
    {
        new JProperty("Property1",
            new JObject
            {
                new JProperty("Property1_1", "SomeValue"),
                new JProperty("Property1_2", "SomeValue"),
            }
        ),
        new JProperty("Property2", "SomeValue"),
    }
};
2
json["report"] = new JObject
    {
        { "name", fm.Name }
    };

Newtonsoft utilise une approche plus directe, où vous pouvez accéder à n'importe quelle propriété via des crochets []. Il vous suffit de définir le JObject, qui doit être créé en fonction des spécificités de Newtonsoft.

Code complet:

var json = JObject.Parse(@"
{
    ""report"": {},
    ""expense"": {},
    ""invoices"": {},
    ""settings"": {
        ""users"" : {}
    },
}");

Console.WriteLine(json.ToString());

json["report"] = new JObject
    {
        { "name", fm.Name }
    };

Console.WriteLine(json.ToString());

Sortie:

{
  "report": {},
  "expense": {},
  "invoices": {},
  "settings": {
    "users": {}
  }
}

{
  "report": {
    "name": "SomeValue"
  },
  "expense": {},
  "invoices": {},
  "settings": {
    "users": {}
  }
}

Comme référence, vous pouvez consulter ce lien: https://www.newtonsoft.com/json/help/html/ModifyJson.htm

2
Tatranskymedved