9 votes

Fusionner deux tableaux Json.NET en concaténant les éléments qu'ils contiennent

J'ai deux JToken qui représentent des tableaux d'objets JSON et je voudrais les fusionner. JToken a une méthode Concat mais elle renvoie null comme résultat lorsque j'essaie de l'utiliser.

Action Ok = (x) =>
{
    Debug.WriteLine(x);
    /* outputs
    [
      {
        "id": 1,
      },
      {
        "id": 2,
      }
    ]
    */

    x = (x).Concat(x) as JToken;
    Debug.WriteLine(x); // null
};

Comment puis-je le faire fonctionner?

33voto

theDmi Points 1307

Utilisez JContainer.Merge() avec MergeArrayHandling.Concat.

Ceci est disponible à partir de Json.NET 6 Release 4. Donc si vos tableaux sont dans un JContainer (par exemple un JObject), c'est une solution simple et robuste.

Exemple:

JObject o1 = JObject.Parse(@"{
  'FirstName': 'John',
  'LastName': 'Smith',
  'Enabled': false,
  'Roles': [ 'User' ]
}");
JObject o2 = JObject.Parse(@"{
  'Enabled': true,
  'Roles': [ 'Operator', 'Admin' ]
}");

o1.Merge(o2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat });

string json = o1.ToString();
// {
//   "FirstName": "John",
//   "LastName": "Smith",
//   "Enabled": true,
//   "Roles": [
//     "User",
//     "Operator",
//     "Admin"
//   ]
// }

9voto

Anton Points 229
JToken.FromObject(x.Concat(x))

2voto

Anthony Johnston Points 3133

J'avais besoin de la même chose, voici ce que j'ai trouvé

https://github.com/MrAntix/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Linq/MergeExtensions.cs

public static void MergeInto(
    this JContainer left, JToken right, MergeOptions options)
{
    foreach (var rightChild in right.Children())
    {
        var rightChildProperty = rightChild;
        var leftPropertyValue = left.SelectToken(rightChildProperty.Name);

        if (leftPropertyValue == null)
        {
            // aucune propriété correspondante, juste ajouter
            left.Add(rightChild);
        }
        else
        {
            var leftProperty = (JProperty) leftPropertyValue.Parent;

            var leftArray = leftPropertyValue as JArray;
            var rightArray = rightChildProperty.Value as JArray;
            if (leftArray != null && rightArray != null)
            {
                switch (options.ArrayHandling)
                {
                    case MergeOptionArrayHandling.Concat:

                        foreach (var rightValue in rightArray)
                        {
                            leftArray.Add(rightValue);
                        }

                        break;
                    case MergeOptionArrayHandling.Overwrite:

                        leftProperty.Value = rightChildProperty.Value;
                        break;
                }
            }

            else
            {
                var leftObject = leftPropertyValue as JObject;
                if (leftObject == null)
                {
                    // remplacer la valeur
                    leftProperty.Value = rightChildProperty.Value;
                }

                else
                    // récursion de l'objet
                    MergeInto(leftObject, rightChildProperty.Value, options);
            }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X