私は次の形式でJSONを持っています。Json.NETを使用して、参照用のカスタムフォーマットを使用するときに、参照によってオブジェクトを逆シリアル化することはできますか?
{
"users": [
{
"first_name": "John",
"last_name": "Smith",
"vet": [ "FOO", "VET-1" ],
"animals": [ [ "FOO", "ANIMAL-22" ] ]
},
{
"first_name": "Susan",
"last_name": "Smith",
"vet": [ "FOO", "VET-1" ]
}
],
"BAR": {
"VET-1": {
"vet_name": "Acme, Inc",
"vet_id": 456
},
"ANIMAL-22": {
"animal_name": "Fido",
"species": "dog",
"animal_id": 789,
"vet": [ "FOO", "VET-1" ]
}
}
}
いくつかのネストされたオブジェクト、または複数回参照しているオブジェクトを、参照としてシリアライズされます。
参照されるオブジェクトは、JSONオブジェクトの末尾にあるBAR
配列に含まれ、[ "FOO", "ANIMAL-22" ]
配列で特定されます。
(いずれもFOO
とBAR
は静的定数であり、ANIMAL-22
/VET-1
識別子は、半ランダムである)
は残念ながら、これは一致していませんかJson.NETすでにserializes/deserializes referenced objectsと私はしていないよう実装することができIReferenceResolver行動を十分に調整することができます(it's fixed to use "$ref"開始)。
影響を受けたプロパティのカスタムJsonConverterを書きましたが、ルートオブジェクトのBAR
プロパティへの参照を取得できませんでした。
Json.NETをこの種のC#クラス構造に上記のJSONを逆シリアル化する方法はありますか?
public class User
{
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
[JsonProperty("vet")]
public Vet Vet { get; set; }
[JsonProperty("animals")]
public List<Animal> Animals { get; set; }
}
public class Vet
{
[JsonProperty("vet_id")]
public int Id { get; set; }
[JsonProperty("vet_name")]
public string Name { get; set; }
}
public class Animal
{
[JsonProperty("animal_id")]
public int Id { get; set; }
[JsonProperty("animal_name")]
public string Name { get; set; }
[JsonProperty("vet")]
public Vet Vet { get; set; }
[JsonProperty("species")]
public string Species { get; set; }
}
編集#1:私は私の例でのみAnimal
とVet
を与えますが、そこにこの方法で参照種類が多数あり、私は「ジェネリック」やタイプが必要だと思いますアレイ構造[ "FOO", "..." ]
のこのような発生を処理する診断ソリューションは、各C#タイプを個別にコードする必要はありません。
いいえ、あなたはこれを自動的に実現することができません。 Json.NETはシングルパスシリアライザですが、 '' ANIMAL-22''と '' VET-1''はJSONへの*前方参照*になりますオブジェクトは後でファイルに現れ、参照が読み込まれた時点では読み込まれません。このような参照を修正するために、デシリアライゼーション後にオブジェクトを後処理するか、LINQ to JSONを使用してJson.NETの必要な形式にJSONを前処理する必要があります。 – dbc