나는 다음과 같은 형식으로 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을 위의 JSON을 위와 같은 C# 클래스 구조로 역 직렬화 할 수있는 방법이 있습니까?
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은 '$ ref'속성 이름의 하드 코딩을 제쳐 놓고 싱글 패스 시리얼 라이저이지만''ANIMAL-22 ''와''VET-1''은 JSON에 대한 * forward references * 나중에 파일에 나타나는 개체는 참조를 읽을 때 읽히지 않습니다. 이러한 참조를 수정하기 위해 직렬화 해제 후에 객체를 수동으로 후 처리하거나 LINQ to JSON을 사용하여 Json.NET의 필수 형식으로 JSON을 전처리해야합니다. – dbc