大きな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つがあります。
既存のコードに合わせるには、パスをで分割してから'.'
、それらを繰り返し処理します。パスがない場合は、で作成し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());
それ以外の場合は、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());
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加