2017-07-16 13 views
0

JSON.NETで生成されたJSON.NETで生成されたJSONを、タイプ名の処理を設定してjsonに変換することはできますか?typenameHandling jsonを通常のjsonに変換

私のアプリケーションは、受け取っているタイプについて何も仮定することはできません。なぜなら、1000個ものクラスのうちの1つであるからです。私はちょうどjsonから型情報を削除する必要があります。例えば

私は自分のアプリケーションでこのJSON文字列を受け取る:

{ 
    "$type": "MyAssembly.MyType, MyAssembly", 
    "$id": 1, 
    "MyValue": 5 
} 

私はこのJSONに変換することができ:

{ 
    "MyValue": 5 
} 

私はjオブジェクトに元のJSONをロードしようとしたし、その後削除しましたすべてのメンバーは$で始まっていますが、配列で作業するときには次のようになります。

{ 
    "MyArray": { 
    "$type": "System.Collections.List, System", 
    "$values": [ 
     { 
     "$type": "MyAssembly.MyType, MyAssembly", 
     "MyValue": 5 
     } 
    ] 
    } 
} 

このような変換が可能なJSON.NETには何も組み込まれていますか?ここで


は、私がhttp://json2csharp.com/を使用する場合は、構造の下、私はそれと

public class RootObject 
{ 
    public string __invalid_name__$type { get; set; } 
    public int __invalid_name__$id { get; set; } 
    public int MyValue { get; set; } 
} 

を取得し、私は

class Program 
{ 
    static void Main(string[] args) 
    { 
     JsonSerializerSettings withNamehandling = new JsonSerializerSettings() 
     { 
      TypeNameHandling = TypeNameHandling.All, 
      ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
      PreserveReferencesHandling = PreserveReferencesHandling.All, 
      Formatting = Formatting.Indented 
     }; 

     var obj = new MyObj(); 

     //This is the json which my application will be receiving. My application does not know about MyObj or MyType. 
     var json = JsonConvert.SerializeObject(obj, withNamehandling); 
     Console.WriteLine(json); 

     //Deserialize the object without namehandling enabled 
     var deserializeObject = JsonConvert.DeserializeObject(json); 
     //Serialize again without namehandling enabled 
     var json2 = JsonConvert.SerializeObject(deserializeObject, Formatting.Indented); 
     //Metadata removed from root node but not children. 
     Console.WriteLine(json2); 

     Console.ReadLine(); 
    } 
} 

class MyObj 
{ 
    public List<MyType> Types { get; set; } = new List<MyType>() 
    { 
     new MyType() 
     { 
      Value = 5 
     } 
    }; 
} 

class MyType 
{ 
    public int Value { get; set; } 
} 
+0

あなたは '「$番号」'と '「$ refを」' 'のようなPreserveReferencesHandling'トークンをどうする何をしたいですか?最初の '' $ id ''は削除するのは簡単ですが、' '$ ref" 'は単にJSON階層内の他の場所へのポインタなので問題があります。あなたの質問の元のバージョンでは、 'PreserveReferencesHandling'トークンを削除する必要はありませんでしたが、あなたはそれをあなたのアップデートに加えて、もっと複雑にしているようです。 – dbc

答えて

0

何を意味するかを示すための例です。あなたは

ようにモデルを作成した場合どのような
public class MyType 
{ 
    public int MyValue { get; set; } 
} 

nはあなたにもJsonPropertyアノテーションを使用し、はい、あなたはデータをデシリアライズし、それを再シリアライズすることができます

public class RootObject 
{ 
    [JsonProperty(Required = Required.Default)] 
    public string __invalid_name__$type { get; set; } 
    [JsonProperty(Required = Required.Default)] 
    public int __invalid_name__$id { get; set; } 
    public int MyValue { get; set; } 
} 
+0

外部アプリケーションにプッシュされる前に、* json.netのシリアライズされたjsonのタイプ情報を削除する必要があります。私は実際のタイプがjsonに含まれているかどうかわからないので、これはオプションではありません。私はjson.netのメタ情報を削除するだけです。 –

+0

@NickWilliams、回答があれば編集してください。また、デシリアライズする方法としてコードを投稿してください – Rahul

+0

私はそれが役に立たないと思います。私のアプリケーションは 'MyType'についての知識がないので、クラスを作成することはできません。メタデータを削除するだけです。役に立つ場合のサンプルプログラムを追加しました –

0

ように要求されない特定のプロパティを作ることができ、そのタイプMyType

にそれをデシリアライズ。デフォルトでは、JSON .NETには型名が含まれないため、シリアル化側で目的を設定して同じアセンブリを使用してデータをシリアル化/逆シリアル化する必要があります。今、あなたはJsonSerializerSettingsを作成してNoneTypeNameHandlingを設定

public class RootObject 
{ 
    public List<MyObject> MyArray { get; set; } 
} 

public class MyObject 
{ 
    public MyType MyValue { get; set; } 
} 

//I assume this because there's not info about "MyType" 
public class MyType : String { } 

var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None }; 

そしてデシリアライズ最初の実際のデータとフィットするモデルを作成し、データをデシリアライズするためにとにかく

、構造体へのデータ:

var deser = JsonConvert.DeserializeObject<RootObject>(seria, settings); 

は、今、あなたは、データが再構築されていて、あなたがいないタイプの処理でそれを再シリアライズすることができ、それはすべての名前空間とクラスタイプを削除します:

var cleanJson = JsonConvert.SerializeObject(deser, settings); 

EDIT:

あなたは構造を再構築する必要がない場合投稿とデ/ jオブジェクトにシリアライズとしてだけで設定を使用します。

var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None }; 
var deser = JsonConvert.DeserializeObject(SourceData, settings); 
var clean = JsonConvert.SerializeObject(deser, settings); 
+0

更新を参照してください。私のアプリケーションは、受け取っているタイプについて何も想定することはできません。何千ものクラスのうちの1つです。私はちょうどjsonから型情報を削除する必要があります。 –

+0

@NickWilliams私の更新を見てください。そして、あなたが非常に厳しい要件を持っているならば、質問にそれらを説明してください。 – Gusman

+0

私はそれを明確にしたと思ったが、明らかに私はそれをしなかった。とにかく、あなたの編集は私のサンプルと同じ結果をもたらし、配列のすべての型情報を残します。配列はまだ '$ type'と' $ array'に分割されています –

関連する問題