パスに基づいて新しいJPropertyをJSONに追加するにはどうすればよいですか?

user9729207

大きなJSONファイル(約1000行)があります。タスクは、既存のJPropertiesを更新するか、構造内の特定の場所に新しいJPropertiesを追加することです。新しいテキストの場所は、JToken.Pathプロパティに基づいています。たとえば、これはJSONの始まりです。

"JonSnow": {
    "Direwolf": {
        "Name": "Ghost",
        "Color": "White",
    }
}
"DanaerysTargaryen": {
    "Dragons": {
        "Dragon1": {
            "Name": "Drogon",
        }
    }
    "Hair": {
        "Color": "White"
    }
}

ここで、JSONは、JTokenパスと対応する値の指定されたリストを使用して更新する必要があります。

最初の可能性は、パスに対応するJPropertyがすでに存在している可能性があることです。その場合、値を更新する必要があります。私はすでにこれをでうまく実装していJToken.Replace()ます。

2番目の可能性は、JPropertyがまだ存在せず、追加する必要があることです。たとえば"DanaerysTargaryen.Dragons.Dragon1.Color"、値を追加する必要があります"Black"

JSON.NetAdd()メソッドを使用できることはわかっていますが、これを使用するには、パスの最後の子トークンのみがJSONから欠落している可能性があります。たとえば、私は使用することができます

JObject ObjToUpdate= JObject.Parse(jsonText);
JObject Dragon = ObjToUpdate["DanaerysTargaryen"]["Dragons"]["Dragon1"] as JObject;
Dragon.Add("Color", "Black"));

しかし"JonSnow.Weapon.Type"、値を追加する必要がある場合はどうなります"Longsword"か?そのため"Weapon"JPropertyとしてまだ存在し、それが一緒に追加する必要はありません"Type" : "Longsword"各パスでは、JSONにすでに存在するパスの量不明です。これをどのようにパラメータ化できますか?

// from outside source: Dictionary<string, string> PathBasedDict 
// key: Jtoken.Path (example: "JonSnow.Weapon.Type")
// value: new text to be added (example: "Longsword")

foreach(KeyValuePair entry in PathBasedDict)
{
    string path = entry.Key;
    string newText = entry.Value;

    if (ObjToUpdate.SelectToken(path) != null)  
        { ObjToUpdate.SelectToken(path).Replace(newText); }

    else AddToJson(path, newText);
}

どのAddToJson()ように見えるべきですか?パス全体を繰り返し処理し、可能な各JPropertyをチェックして存在するかどうかを確認してから、残りを下に追加するのは非常に面倒なようです。これを行うためのより良い方法はありますか?私が知らないJson.NETのトリックはありますか?反復をどのようにパラメーター化できるかさえわかりません。

異端の猿

これを行うにはいくつかの方法があります。ここにそれらの2つがあります。

  1. 既存のコードに合わせるには、パスをで分割してから'.'、それらを繰り返し処理します。パスがない場合は、で作成しAddます。それ以外の場合、パスの最後の部分にいる場合は、値を追加するだけです。

    var json = JObject.Parse(@"{""DanaerysTargaryen"":{""Dragons"":{""Dragon1"":{""Name"": ""Drogon""}},""Hair"": {""Color"": ""White""}}}");
    var toAdd = "DanaerysTargaryen.Dragons.Dragon1.Color";
    var valueToAdd = "Black";
    var pathParts = toAdd.Split('.');
    JToken node = json;
    for (int i = 0; i < pathParts.Length; i++)
    {
        var pathPart = pathParts[i];
        var partNode = node.SelectToken(pathPart);
        if (partNode == null && i < pathParts.Length - 1)
        {
            ((JObject)node).Add(pathPart, new JObject());
            partNode = node.SelectToken(pathPart);
        }
        else if (partNode == null && i == pathParts.Length - 1)
        {
            ((JObject)node).Add(pathPart, valueToAdd);
            partNode = node.SelectToken(pathPart);
        }
        node = partNode;
    }
    
    Console.WriteLine(json.ToString());
    

(dotnetfiddle.netの例)

  1. それ以外の場合は、JObject追加するノードを表す個別のノードを作成してから、それらをマージすることができます。

     var json = JObject.Parse(@"{""DanaerysTargaryen"":{""Dragons"":{""Dragon1"":{""Name"": ""Drogon""}},""Hair"": {""Color"": ""White""}}}");
     var toMerge = @"{""DanaerysTargaryen"":{""Dragons"":{""Dragon1"":{""Color"":""Black""}}}}";
     var jsonToMerge = JObject.Parse(toMerge);
     json.Merge(jsonToMerge);
     Console.WriteLine(json.ToString());
    

(dotnetfiddle.netの例)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Labelに基づいてXamarinで新しい要素を作成するにはどうすればよいですか?

分類Dev

Pythonの前の要素に基づいてリストに新しい要素を追加するにはどうすればよいですか?

分類Dev

行ベースの計算に基づいてPandasDataFrameに新しい列を追加するにはどうすればよいですか?

分類Dev

条件に基づいて新しい列を作成するにはどうすればよいですか?

分類Dev

新しい列に基づいて各行を複製するにはどうすればよいですか?

分類Dev

新しい列の条件に基づいて値を生成するにはどうすればよいですか?

分類Dev

条件に基づいてmatlabのテーブルに新しい値を追加するにはどうすればよいですか?

分類Dev

列の値に基づいて既存のデータフレームに新しい行を追加するにはどうすればよいですか?

分類Dev

別の配列の値に基づいて、配列内の各ActiveRecordに新しい属性を追加するにはどうすればよいですか?

分類Dev

反復せずにパンダの2+条件に基づいて新しいdf.columnを作成するにはどうすればよいですか?

分類Dev

VBのデータテーブルの既存の列に基づいて新しい列を追加するにはどうすればよいですか?

分類Dev

JSON配列に新しいプロパティを追加するにはどうすればよいですか?

分類Dev

別の数に基づいて数にゼロを追加するにはどうすればよいですか?

分類Dev

以前の複数の値のパンダの状態に基づいて新しい列を計算するにはどうすればよいですか

分類Dev

パンダの前のテーブルに基づいて新しいテーブルを作成するにはどうすればよいですか?

分類Dev

Pythonで文字列に基づいて形状を追加するにはどうすればよいですか?

分類Dev

パンダの列で文字列を検索し、その文字列に基づいて行に追加するにはどうすればよいですか?

分類Dev

LLVMパスに新しいコード行を追加するにはどうすればよいですか?

分類Dev

.binまたは.vdiファイルに基づいて新しいVagrantボックスを生成するにはどうすればよいですか?

分類Dev

他の行に基づいて行を追加するにはどうすればよいですか?

分類Dev

OpenRefineの位置に基づいて文字列文字を追加するにはどうすればよいですか?

分類Dev

groupbyと発生数に基づいて列を追加するにはどうすればよいですか?

分類Dev

特定の条件に基づいて行を追加するにはどうすればよいですか?

分類Dev

Rの条件に基づいて列を追加するにはどうすればよいですか?

分類Dev

CSV-既存の列に基づいて列を追加するにはどうすればよいですか?

分類Dev

Vue.jsを使用して小道具に基づいて要素に複数のクラスを追加するにはどうすればよいですか?

分類Dev

マスターの新しい変更に基づいて変更を続行するにはどうすればよいですか

分類Dev

計算条件に基づいて新しい列ベースを作成するにはどうすればよいですか?

分類Dev

Pysparkのデータフレームの条件に基づいて新しいリスト値を設定するにはどうすればよいですか?

Related 関連記事

  1. 1

    Labelに基づいてXamarinで新しい要素を作成するにはどうすればよいですか?

  2. 2

    Pythonの前の要素に基づいてリストに新しい要素を追加するにはどうすればよいですか?

  3. 3

    行ベースの計算に基づいてPandasDataFrameに新しい列を追加するにはどうすればよいですか?

  4. 4

    条件に基づいて新しい列を作成するにはどうすればよいですか?

  5. 5

    新しい列に基づいて各行を複製するにはどうすればよいですか?

  6. 6

    新しい列の条件に基づいて値を生成するにはどうすればよいですか?

  7. 7

    条件に基づいてmatlabのテーブルに新しい値を追加するにはどうすればよいですか?

  8. 8

    列の値に基づいて既存のデータフレームに新しい行を追加するにはどうすればよいですか?

  9. 9

    別の配列の値に基づいて、配列内の各ActiveRecordに新しい属性を追加するにはどうすればよいですか?

  10. 10

    反復せずにパンダの2+条件に基づいて新しいdf.columnを作成するにはどうすればよいですか?

  11. 11

    VBのデータテーブルの既存の列に基づいて新しい列を追加するにはどうすればよいですか?

  12. 12

    JSON配列に新しいプロパティを追加するにはどうすればよいですか?

  13. 13

    別の数に基づいて数にゼロを追加するにはどうすればよいですか?

  14. 14

    以前の複数の値のパンダの状態に基づいて新しい列を計算するにはどうすればよいですか

  15. 15

    パンダの前のテーブルに基づいて新しいテーブルを作成するにはどうすればよいですか?

  16. 16

    Pythonで文字列に基づいて形状を追加するにはどうすればよいですか?

  17. 17

    パンダの列で文字列を検索し、その文字列に基づいて行に追加するにはどうすればよいですか?

  18. 18

    LLVMパスに新しいコード行を追加するにはどうすればよいですか?

  19. 19

    .binまたは.vdiファイルに基づいて新しいVagrantボックスを生成するにはどうすればよいですか?

  20. 20

    他の行に基づいて行を追加するにはどうすればよいですか?

  21. 21

    OpenRefineの位置に基づいて文字列文字を追加するにはどうすればよいですか?

  22. 22

    groupbyと発生数に基づいて列を追加するにはどうすればよいですか?

  23. 23

    特定の条件に基づいて行を追加するにはどうすればよいですか?

  24. 24

    Rの条件に基づいて列を追加するにはどうすればよいですか?

  25. 25

    CSV-既存の列に基づいて列を追加するにはどうすればよいですか?

  26. 26

    Vue.jsを使用して小道具に基づいて要素に複数のクラスを追加するにはどうすればよいですか?

  27. 27

    マスターの新しい変更に基づいて変更を続行するにはどうすればよいですか

  28. 28

    計算条件に基づいて新しい列ベースを作成するにはどうすればよいですか?

  29. 29

    Pysparkのデータフレームの条件に基づいて新しいリスト値を設定するにはどうすればよいですか?

ホットタグ

アーカイブ