C# 4.0 使用json.NET C反序列化带有内部类的json文件#

C# 4.0 使用json.NET C反序列化带有内部类的json文件#,c#-4.0,json.net,C# 4.0,Json.net,我的json文件中有以下结构 "missionName": "missionname", "thumb_image": "pics/mission-info.png", "uplinkPage": [ { "RPC": { "name": "RPC", "rpc": "", "args": "" }, "EXE": { "name"

我的json文件中有以下结构

  "missionName": "missionname",
  "thumb_image": "pics/mission-info.png",
   "uplinkPage": [
    {
        "RPC": {
            "name": "RPC",
            "rpc": "",
            "args": ""
        },
        "EXE": {
            "name": "app1",
            "prog": "",
            "args": ""
        },
        "VM": {
            "name": "VM",
            "name": "",
            "args": ""
        },
        "JAR": {
            "name": "JAR",
            "prog": "",
            "args": ""
        },
        "link": {
            "name": "somelink",
            "url": ""
        }
    }
],
为此,我有以下几节课

 public class EXE
{
   public string name { get; set; }
   public string prog { get; set; }
   public string args { get; set; }
}

public class RPC
{
    public string name { get; set; }
    public string rpc { get; set; }
    public string args { get; set; }
}

public class VM
{
    public string name { get; set; }
    public string args { get; set; }
}

public class JAR
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class Link
{
    public string name { get; set; }
    public string url { get; set; }
}

 public class UplinkPage
{
    public VM[] vmList { get; set; }
    public EXE[] exeList { get; set; }
    public RPC[] rpcList { get; set; }
    public JAR[] jarList { get; set; }
    public Link[] linkList { get; set; }
}

 public class Rootobject
{
    public string missionName { get; set; }
    public string thumb_image { get; set; }     
    public Uplinkpage[] uplinkPage { get; set; }        
}
uplinkPage部分可以有一个或多个EXE、RPC、VM。。部分。我尝试过像这样添加多个部分

"EXE": {
            "1": {
                "name": "app1",
                "data-prog": "",
                "data-args": ""
            },
            "2": { 
                "name": "app2",
            "data-prog": "",
            "data-args": ""
            }
        }
当我这样做反序列化时

Rootobject page = JsonConvert.DeserializeObject<Rootobject>(File.ReadAllText("mission1.json"));
我会得到最后一个,如果

Dictionary<string,EXE> exeList {get; set;}
Dictionary exeList{get;set;}
我要第一个。我注意到,当我使用字典时,EXE的类型变为EXE1

所以我想知道我做错了什么?我在这儿有什么事吗

干杯,
es

每当您有一个可能重复的JSON属性时,最容易将该属性的值表示为JSON,而不是用重复的名称表示多个属性。即代替

{
    "EXE" : {"id":1},
    "RPC" : {"name":"a"},        
    "EXE" : {"id":2},
}
您要执行以下操作:

{
    "EXE" : [{"id":1}, {"id":2}],
    "RPC" : [{"name":"a"}]        
}
类似地,在
VM
类中,
name
多次出现,因此
name
也应该是一个数组:

public class VM
{
    public string [] name { get; set; }
    public string args { get; set; }
}
(反序列化重复的属性名称并非不可能,只是比较困难,而且需要自定义转换器。请参阅。由于您控制JSON格式,因此我建议避免这种情况。按照您在问题中提出的建议,使用带索引属性的嵌套对象也是一种选择;难度较小,但仍然需要自定义转换。请参阅。但是使用JSON数组是最简单的。)

接下来,您需要告诉Json.NET如何将c#属性名称映射到不一致的Json属性名称。例如,在Json中,您有一个属性
“EXE”
,但在c#中,属性名称是
public EXE[]exeList{get;set;}
。您可以重命名JSON属性、重命名c#属性或使用以下方法进行映射:

我还注意到,您的
EXE
对象有时有一个
“data prog”
属性,有时只有一个
“prog”
。您应该在其中进行标准化

因此,您的JSON应该如下所示:

public class EXE
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class RPC
{
    public string name { get; set; }
    public string rpc { get; set; }
    public string args { get; set; }
}

public class VM
{
    public string [] name { get; set; }
    public string args { get; set; }
}

public class JAR
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class Link
{
    public string name { get; set; }
    public string url { get; set; }
}

public class UplinkPage
{
    [JsonProperty("VM")]
    public VM[] vmList { get; set; }

    [JsonProperty("EXE")]
    public EXE[] exeList { get; set; }

    [JsonProperty("RPC")]
    public RPC[] rpcList { get; set; }

    [JsonProperty("JAR")]
    public JAR[] jarList { get; set; }

    [JsonProperty("link")]
    public Link[] linkList { get; set; }
}

public class Rootobject
{
    public string missionName { get; set; }
    public string thumb_image { get; set; }
    public UplinkPage[] uplinkPage { get; set; }
}
你的课程应该是这样的:

public class EXE
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class RPC
{
    public string name { get; set; }
    public string rpc { get; set; }
    public string args { get; set; }
}

public class VM
{
    public string [] name { get; set; }
    public string args { get; set; }
}

public class JAR
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class Link
{
    public string name { get; set; }
    public string url { get; set; }
}

public class UplinkPage
{
    [JsonProperty("VM")]
    public VM[] vmList { get; set; }

    [JsonProperty("EXE")]
    public EXE[] exeList { get; set; }

    [JsonProperty("RPC")]
    public RPC[] rpcList { get; set; }

    [JsonProperty("JAR")]
    public JAR[] jarList { get; set; }

    [JsonProperty("link")]
    public Link[] linkList { get; set; }
}

public class Rootobject
{
    public string missionName { get; set; }
    public string thumb_image { get; set; }
    public UplinkPage[] uplinkPage { get; set; }
}

原型。

您可以控制JSON的格式吗?是的,我可以完全控制它,但我认为我使用的格式不正确。
{
  "missionName": "missionname",
  "thumb_image": "pics/mission-info.png",
  "uplinkPage": [
    {
      "RPC": [
        {
          "name": "RPC",
          "rpc": "",
          "args": ""
        }
      ],
      "EXE": [
        {
          "name": "app1",
          "prog": "prog1",
          "args": "args1"
        },
        {
          "name": "app2",
          "prog": "prog2",
          "args": "args2"
        }
      ],
      "VM": [
        {
          "name": [
            "VM",
            ""
          ],
          "args": ""
        }
      ],
      "JAR": [
        {
          "name": "JAR",
          "prog": "",
          "args": ""
        }
      ],
      "link": [
        {
          "name": "somelink",
          "url": ""
        }
      ]
    }
  ]
}
public class EXE
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class RPC
{
    public string name { get; set; }
    public string rpc { get; set; }
    public string args { get; set; }
}

public class VM
{
    public string [] name { get; set; }
    public string args { get; set; }
}

public class JAR
{
    public string name { get; set; }
    public string prog { get; set; }
    public string args { get; set; }
}

public class Link
{
    public string name { get; set; }
    public string url { get; set; }
}

public class UplinkPage
{
    [JsonProperty("VM")]
    public VM[] vmList { get; set; }

    [JsonProperty("EXE")]
    public EXE[] exeList { get; set; }

    [JsonProperty("RPC")]
    public RPC[] rpcList { get; set; }

    [JsonProperty("JAR")]
    public JAR[] jarList { get; set; }

    [JsonProperty("link")]
    public Link[] linkList { get; set; }
}

public class Rootobject
{
    public string missionName { get; set; }
    public string thumb_image { get; set; }
    public UplinkPage[] uplinkPage { get; set; }
}