プロパティ名は読み取り専用なので、プロパティ全体を置き換える必要があります。これを行うには、Replace
メソッドを使用することができます。
if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}
しかし、これは別のproblem--につながる、あなたがそれを反復処理しながら、JObject
のProperties
コレクションを変更しようとしていることから、Json.NetがスローされますInvalidOperationException
。この問題を回避するには、プロパティを別のリストにコピーし、代わりにそれを反復処理する必要があります。あなたはこのようなあなたのforeach
でToList()
方法を使用していることを行うことができます。
foreach (JProperty jp in jo.Properties().ToList())
を最後に、ちょうど私たちが持っているすべて一緒にそれを置くToString().
を使用し、バックJSONに更新JObject
を変換する:
public static string ChangeNumericalPropertyNames(JsonReader reader)
{
JObject jo = JObject.Load(reader);
foreach (JProperty jp in jo.Properties().ToList())
{
if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}
}
return jo.ToString();
}
フィドルを:https://dotnetfiddle.net/rX4Jyy
上記のメソッドは、単純なJSON objプロパティをすべて1つのレベルで扱います。実際のJSONがフラットではなく階層的であることをコメントで示しました。
public static string ChangeNumericalPropertyNames(JsonReader reader)
{
JObject jo = JObject.Load(reader);
ChangeNumericalPropertyNames(jo);
return jo.ToString();
}
public static void ChangeNumericalPropertyNames(JObject jo)
{
foreach (JProperty jp in jo.Properties().ToList())
{
if (jp.Value.Type == JTokenType.Object)
{
ChangeNumericalPropertyNames((JObject)jp.Value);
}
else if (jp.Value.Type == JTokenType.Array)
{
foreach (JToken child in jp.Value)
{
if (child.Type == JTokenType.Object)
{
ChangeNumericalPropertyNames((JObject)child);
}
}
}
if (Regex.IsMatch(jp.Name, @"^\d"))
{
string name = "n" + jp.Name;
jp.Replace(new JProperty(name, jp.Value));
}
}
}
フィドル:https://dotnetfiddle.net/qeZK1C
JSON文字列にプロパティ名を交換し、階層構造で数値プロパティ名のすべてを交換するためには、あなたはこのように、あなたのメソッドの再帰を作成する必要がありますjsonをシリアル化します。 –
名前を設定する方法がわからないので、単純ではありません。 jp.Nameが読み込み専用であるため、jp.Name = nameのようなことはできません。 –
jsonの文字列とmodifiy it_idkを取り、 'Regex.Replace()'を実行して、その変更された文字列を直列化します。 –