如何从json创建一个c#对象

Gre*_*ndy 10 .net c# json

我从Web服务得到以下响应:

{
  "data":{
    "foo.hugo.info": {
      "path": "logon.cgi",
      "minVersion": 1,
      "maxVersion": 2
    },
    "foo.Fritz.Task": {
      "path": "Fritz/process.cgi",
      "minVersion": 1,
      "maxVersion": 1
    }
  },
  "success": true
}
Run Code Online (Sandbox Code Playgroud)

json-object必须如何反序列化?

或者是否有其他方法来获取属性的值?

Dar*_*rov 7

随着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; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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);
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我使用了一个Dictionary<string, Data>对象来建模2个复合键(foo.hugo.infofoo.Fritz.Task),因为它们包含不能在.NET成员中使用的名称.


dav*_*v_i 5

如果您使用的是VS2012或更高版本,则可以执行以下操作:

Edit > Paste Special > Paste JSON As Classes
Run Code Online (Sandbox Code Playgroud)

在您的示例中,这会导致:

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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不灵活,如果添加第三个变体,您需要创建另一个类并将其作为属性添加到`Data`类. (2认同)