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