사용자 정의 JavaScriptConverter
클래스를 사용하여 JSON 요소를 읽고 그로 인해 발생하는 문제를 해결할 수 있습니다. 즉, 이름이 배열 인 경우 클래스에 하나의 속성을 채우거나 단일 객체 인 경우, 다른 속성을 채 웁니다. 물론 질문에 표시된 것처럼 명시 적 인터페이스를 사용하지 않고 같은 이름의 두 멤버가있는 클래스를 정의 할 수 없으므로 속성의 이름이 달라야합니다.
이 같은 클래스 뭔가를 정의 할 수 있습니다 :
public class NameObject
{
public string[] Names { get; set; }
public string Name
{
get { return (Names != null && Names.Length > 0) ? Names[0] : null; }
set { Names = (value != null) ? new string[] { value } : null; }
}
}
당신은 Names
속성은 항상 실제 데이터를 보유하고 있음을 여기에서 볼 수 있습니다, 그리고 Name
속성은 하나의 이름이있는 경우에 단지 편리 . 여기
내가 변환기를 작성할 수 있습니다 방법입니다
public class NameObjectConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { return new Type[] { typeof(NameObject) }; }
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
NameObject nameObj = new NameObject();
string singleName = GetValue<string>(dictionary, "name");
if (singleName != null)
{
nameObj.Name = singleName;
}
else
{
ArrayList arrayList = GetValue<ArrayList>(dictionary, "name");
nameObj.Names = (arrayList != null) ? arrayList.Cast<string>().ToArray() : null;
}
return nameObj;
}
private T GetValue<T>(IDictionary<string, object> dict, string key)
{
object value = null;
dict.TryGetValue(key, out value);
return value != null && typeof(T).IsAssignableFrom(value.GetType()) ? (T)value : default(T);
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
NameObject nameObj = (NameObject)obj;
Dictionary<string, object> dict = new Dictionary<string, object>();
if (nameObj.Names != null && nameObj.Names.Length == 1)
{
dict.Add("name", nameObj.Name);
}
else
{
dict.Add("name", nameObj.Names);
}
return dict;
}
}
당신은에 등록해야하며, 컨버터를 사용하려면를 JavaScriptSerializer
: 여기
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new List<JavaScriptConverter> { new NameObjectConverter() });
행동의 컨버터를 보여주는 데모입니다 두 JSON 형식. (난 당신이 실제 JSON이 문제의 모양을 언급하지 않았기 때문에 여기에 일부 가짜 JSON을했습니다.)
public class Program
{
public static void Main(string[] args)
{
string json = @"
{
""doctor"": {
""name"": ""Dr. Herbert Q. Cunningham III""
},
""patients"": {
""name"": [
""Joe Schmoe"",
""John Doe"",
""Steve Smith""
]
}
}";
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new List<JavaScriptConverter> { new NameObjectConverter() });
MedicalData data = serializer.Deserialize<MedicalData>(json);
Console.WriteLine("Doctor's name: " + data.Doctor.Name);
Console.WriteLine("Patients' names: ");
foreach (string name in data.Patients.Names)
{
Console.WriteLine(" " + name);
}
}
}
public class MedicalData
{
public NameObject Doctor { get; set; }
public NameObject Patients { get; set; }
}
출력 :
Doctor's name: Dr. Herbert Q. Cunningham III
Patients' names:
Joe Schmoe
John Doe
Steve Smith
당신이 속성을 사용하려고합니까'[JsonProperty (PropertyName = "name")]' –
JSON 자체가 통제에서 벗어 났습니까? 이것은 현재 JSON의 끔찍한 사용처럼 들립니다. JSON을 동적으로로드 (예 : Json.NET의 LINQ에서 JSON으로)하는 중간 단계를 거쳐 이름이 다른 것으로 수정 된 다음 일반 직렬 변환을 통해 피드 할 수 있습니다. –
'public name name {get; 세트; } [JsonProperty (PropertyName = "name")] public name [] name1 {get; 세트; }' 이 코드를 사용해 보았습니다. 그러나 여전히 오류가 발생합니다. –