2016-06-16 3 views
1

いくつかのJSONをXMLに変換しようとしていますが、その前にいくつかのプロパティを変更して変換を成功させる必要があります。JSONオブジェクトのプロパティ名をXMLに変換する前に変更します

JSON構造のプロパティのいくつかは数字で始まり、XMLに変換しようとすると、XMLで数字で始まるタグが許可されないため、エラーが発生します。

私のために働く1つの解決策は、プロパティで接頭辞を追加することによって数字で始まるプロパティ名を変更することです。

public string ChangeNumericalPropertyNames(JsonReader reader) 
{ 
    JObject jo = JObject.Load(reader); 

    foreach (JProperty jp in jo.Properties()) 
    { 
     if (Regex.IsMatch(jp.Name, @"^\d")) 
     { 
      string name = "n" + jp.Name; 

      //Logic to set changed name 
     } 
    } 

    return "Here I want to return the entire json string with changed names"; 
} 

私はこのしようとすると:私はこのような何かをしようとしている

jp.Name = name; 

Visual Studioは、jp.Nameが読み取り専用であるため、それが不可能であると言います。

誰もこの解決策を達成する方法を知っていますか?

+0

JSON文字列にプロパティ名を交換し、階層構造で数値プロパティ名のすべてを交換するためには、あなたはこのように、あなたのメソッドの再帰を作成する必要がありますjsonをシリアル化します。 –

+0

名前を設定する方法がわからないので、単純ではありません。 jp.Nameが読み込み専用であるため、jp.Name = nameのようなことはできません。 –

+0

jsonの文字列とmodifiy it_idkを取り、 'Regex.Replace()'を実行して、その変更された文字列を直列化します。 –

答えて

2

プロパティ名は読み取り専用なので、プロパティ全体を置き換える必要があります。これを行うには、Replaceメソッドを使用することができます。

 if (Regex.IsMatch(jp.Name, @"^\d")) 
     { 
      string name = "n" + jp.Name; 
      jp.Replace(new JProperty(name, jp.Value)); 
     } 

しかし、これは別のproblem--につながる、あなたがそれを反復処理しながら、JObjectPropertiesコレクションを変更しようとしていることから、Json.NetがスローされますInvalidOperationException。この問題を回避するには、プロパティを別のリストにコピーし、代わりにそれを反復処理する必要があります。あなたはこのようなあなたのforeachToList()方法を使用していることを行うことができます。

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

+0

まず、ご協力いただきありがとうございます。私はあなたのソリューションを試して、それは同じレベルでプロパティで動作します。JSONは次のようである場合には、私は例外を有する、 {1: "1"、 2:{ 3: "三" }} 数値名が別のプロパティのプロパティです。 –

+0

これを処理するには、再帰的なメソッドが必要です。私は私の答えを更新しました。 –

+0

ありがとうございました! –

関連する問題