Я звоню в службу отдыха, и служба возвращает содержимое JSON. Большая часть контента имеет предопределенную структуру, но часть контента динамически основана на параметрах, которые были переданы в службу отдыха. Как только я получаю ответ от службы остального, я хочу десериализовать объект, чтобы я мог легко использовать данные. В настоящее время я использую DataContractJsonSerializer для этого.JSON десериализация для объекта с частичными динамическими свойствами
/// <summary>
/// Deserialize JSON formatted string to an object of a specified type
/// </summary>
/// <typeparam name="T">Object type to deserialize</typeparam>
/// <param name="sJSON">JSON formatted string to deserialize</param>
/// <returns>Returns an instance of an object</returns>
public static T FromJSON<T>(this string sJSON) where T : new()
{
T oValue;
using (System.IO.MemoryStream strJSON = new System.IO.MemoryStream())
{
using (System.IO.StreamWriter swJSON = new System.IO.StreamWriter(strJSON))
{
swJSON.Write(sJSON);
swJSON.Flush();
strJSON.Seek(0, System.IO.SeekOrigin.Begin);
System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
oValue = (T)ser.ReadObject(strJSON);
return oValue;
}
}
}
Вот пример ответа остальные службы:
{
"entities" : [{
"type" : "mytest",
"properties" : {
"Active" : true,
"Category" : "10732",
"Description" : "test test test",
"LastUpdateTime" : 1446676525195,
"Id" : "12655"
}
}
],
"metadata" : {
"status" : "OK",
"count" : 0
}
}
объект всегда будет иметь «сущностей» и свойство «метаданных», метаданные будут всегда иметь «статус» и " count ", и сущности всегда будут массивом, и каждый элемент в массиве будет иметь свойство типа и свойства. Динамический характер вступает в игру для объекта properties, который будет содержать свойства, полностью основанные на том, что было передано в службу отдыха.
Это определение класса, которое я использовал для десериализации строки json в объекты. Но я не уверен, как сделать динамическую часть свойств. Даже если бы я мог закончить словарь значений имен, которые были бы работоспособными. Возможно ли это, в идеале, без требований сторонних json-библиотек?
[DataContract]
public class Response
{
[DataMember(
public Entity[] entities { get; set; }
[DataMember(
public MetaData metadata { get; set; }
}
[DataContract]
public class Entity
{
[DataMember(
public string type { get; set; }
[DataMember()]
public Properties properties { get; set; }
}
[DataContract]
public class Properties
{
//How do I make this part dynamic?
}
[DataContract]
public class MetaData
{
[DataContract]
public enum Status
{
[EnumMember]
OK,
[EnumMember]
FAILED
}
public Status CompletionStatus { get; set; }
[DataMember()]
public string status
{
get
{
return this.CompletionStatus.ToString();
}
set
{
this.CompletionStatus = (Status)Enum.Parse(typeof(Status), value);
}
}
[DataMember()]
public int count{ get; set; }
}
Сделать свойствами а 'Dictionary' –
Rob
@Rob - это не похоже на работу. Свойство «Свойства» всегда имеет счет 0. – Jeremy
более пристально посмотрел на него - вам также нужно настроить сериализатор для правильной сериализации объектов/словарей JSON - см. Ответ отправленный – Rob