使用值作为对象创建JSON

时间:2016-11-09 13:33:14

标签: c# json json.net

不确定标题是否符合我的实际需求,欢迎提出建议。

我创建了一个这样的JSON文件:

{
    "Sonos": [
    {
        "Ips": [
            {
              "Volume": "5",
              "ip": "192.168.10.214"
            },
            {
              "Volume": "5",
              "ip": "192.168.10.204"
            }
          ]
        }
    ]
}

public class GetConfig
{
    public List<Cfg> Sonos { get; set; }
}

public class Cfg
{
    public List<Ip> Ips { get; set; }
}

public class Ip
{
    public string Volume { get; set; }
    public string ip { get; set; }
}

创建JSON

var list = new List<Cfg>();
        var ips = new List<Ip>();

        foreach (ListViewItem item in sonosListExt1.Items)
        {

            ips.Add(new Ip {Volume = "5", ip = item.Text });
        }

        list.Add(new Cfg { Ips = ips });

        var gC = new GetConfig
        {
            Sonos = list
        };
  ...
  //WRITE TO FILE

我真正想要的是什么(不确定是否有效)

{
 "Sonos": [
{
  "192.168.10.214": [
    {
      "Volume": "5"
    },
    "192.168.10.204": [
    {
      "Volume": "5"
    }
  ]
}
]}

我不知道如何创建实际的IP作为包含所述IP的卷的对象。 或者我可能需要一种不同的方法?

我想做什么

我有一个包含IP的列表,循环浏览此列表并希望从config.json文件获取卷,是否有更好的方法?

2 个答案:

答案 0 :(得分:1)

你JSON无效,我认为你的JSON是:

   private class MyWebClient : WebClient {

    public int timeOut { get; set; }

    protected override WebRequest GetWebRequest(Uri address) {
        WebRequest w = base.GetWebRequest(address);
        w.Timeout = timeOut;
        return w;
    }
   }

   public bool checkInternetConnection() {
            try {
                using(MyWebClient client = new MyWebClient()) {
                    client.timeOut = ApiUrls.RemoteServerConnectorTestTimeout;
                    var removeString = "api.php";
                    var testHttp = DefaultServerUrl.EndsWith(removeString) ? DefaultServerUrl.Remove(DefaultServerUrl.Length - removeString.Length, removeString.Length) : DefaultServerUrl;            

                    using(client.OpenRead(testHttp)) {
                        return true;
                    }
                }
            } catch(WebException ex) {
                return ex.Status != WebExceptionStatus.ConnectFailure;
            } catch(Exception ex) {
                return false;
            }
        }

如果是这样,你可以通过这个类结构反序列化它:

{
  "Sonos": [
    {
      "192.168.10.214": [
        {
          "Volume": "5"
        }
      ],
      "192.168.10.204": [
        {
          "Volume": "5"
        }
      ]
    }
  ]
}

可以通过以下方式创建JSON模型:

class Container
{
    public List<Dictionary<string, List<Cfg>>> Sonos { get; set;}
}

class Cfg
{
    public string Volume { get; set; }
}

// ...
var container = JsonConvert.DeserializeObject<Container>(json);

答案 1 :(得分:0)

如果您使用VS 2015并且您已经拥有现有的Json或Xml结构,并且只希望具有用于反序列化的匹配类型,则在编辑菜单中有一个名为“paste Special”的功能。 您只需要在剪贴板中使用json或xml,vs2015将为您生成类。