Как сделать объект С# от json
Получаю следующий ответ от webservice:
{
"data":{
"foo.hugo.info": {
"path": "logon.cgi",
"minVersion": 1,
"maxVersion": 2
},
"foo.Fritz.Task": {
"path": "Fritz/process.cgi",
"minVersion": 1,
"maxVersion": 1
}
},
"success": true
}
Как должен выглядеть json-объект для десериализации этого?
Или есть другой способ получить значения свойств?
Ответы
Ответ 1
В библиотеке JSON.NET
это довольно тривиально:
public class Root
{
public Dictionary<string, Data> Data { get; set; }
public bool Success { get; set; }
}
public class Data
{
public string Path { get; set; }
public int MinVersion { get; set; }
public int MaxVersion { get; set; }
}
а затем:
string json =
@"{
""data"":{
""foo.hugo.info"": {
""path"": ""logon.cgi"",
""minVersion"": 1,
""maxVersion"": 2
},
""foo.Fritz.Task"": {
""path"": ""Fritz/process.cgi"",
""minVersion"": 1,
""maxVersion"": 1
}
},
""success"": true
}";
Root root = JsonConvert.DeserializeObject<Root>(json);
В этом примере я использовал объект Dictionary<string, Data>
для моделирования 2 сложных ключей (foo.hugo.info
и foo.Fritz.Task
), поскольку они содержат имена, которые не могут использоваться в .NET-члене.
Ответ 2
Если вы используете VS2012 или выше, вы можете сделать следующее:
Edit > Paste Special > Paste JSON As Classes
В вашем примере это приводит к:
public class Rootobject
{
public Data data { get; set; }
public bool success { get; set; }
}
public class Data
{
public FooHugoInfo foohugoinfo { get; set; }
public FooFritzTask fooFritzTask { get; set; }
}
public class FooHugoInfo
{
public string path { get; set; }
public int minVersion { get; set; }
public int maxVersion { get; set; }
}
public class FooFritzTask
{
public string path { get; set; }
public int minVersion { get; set; }
public int maxVersion { get; set; }
}
Ответ 3
Посмотрите этот сайт: http://json2csharp.com/
Вставить строку json и создать для вас классы. Я обычно использую это в руке с JSON.NET для десериализации экземпляра корневого объекта.
Ответ 4
Вы можете использовать DataContractJsonSerializer
[DataContract]
public class DetailedData
{
[DataMember(Name="path")]
public string Path { get; set; }
[DataMember(Name = "minVersion")]
public int MinVersion { get; set; }
[DataMember(Name = "maxVersion")]
public int MaxVersion { get; set; }
}
[DataContract]
public class Data
{
[DataMember(Name = "foo.hugo.info")]
public DetailedData Info { get; set; }
[DataMember(Name = "foo.Fritz.Task")]
public DetailedData Task { get; set; }
}
[DataContract]
public class RootObject
{
[DataMember(Name = "data")]
public Data Data { get; set; }
[DataMember(Name = "success")]
public bool Success { get; set; }
}
static void Main(string[] args)
{
string json = "...";
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(RootObject));
RootObject obj = (RootObject)js.ReadObject(new MemoryStream(Encoding.Unicode.GetBytes(json)));
Console.WriteLine(obj.Data.Task.MaxVersion);
}
Изменить: тот же класс для Info
и Task