如何开发嵌套循环格式

时间:2014-03-10 14:34:12

标签: c# .net json

我正在尝试开发以下格式的json。

{
    "contacts":[
    {
        "id":"c200",
        "name":"Ravi Tamada",
        "email":"ravi@gmail.com",
        "address":"xx-xx-xxxx,x - street, x - country",
        "gender":"male",
        "phone":[
        {
            "Section":"International"
        }]       
    }]
}

使用下面我使用了我的程序

public class Cont
{   
    public string sno { get; set; }
    public string name { get; set; }
    public string em { get; set; }
    public string address { get; set; }
    public string gender { get; set; }
    // public Phone phone   = new Phone();  
    public List<Phone> phone { get; set; }
    // Phone = new Phone();
}

public class Phone
{
    public string Section { get; set; }
}    

public class RootObject
{
    public List<Cont> contacts { get; set; }
}

这里我传递了所有值,所有值来自数据库

ContCollection.Add(new Cont()
{
    sno = dr["Cinema"].ToString(),
    name = dr["Gallery"].ToString(),
    address = dr["star"].ToString(),
    gender = dr["video"].ToString(),
    em = "",
    /how can i use  List<Phone> here 
});

请任何人解释我

谢谢和问候

2 个答案:

答案 0 :(得分:1)

包含结构不是循环,因此这不是嵌套循环。实际上,包含结构不是一系列命令式代码语句,所以你甚至不能在这里放一个循环。

这是一个对象初始值设定项:

new Cont()
{
    sno = dr["Cinema"].ToString(),
    name = dr["Gallery"].ToString(),
    address = dr["star"].ToString(),
    gender = dr["video"].ToString(),
    em = ""
}

所以你所能做的就是初始化属性:

new Cont()
{
    sno = dr["Cinema"].ToString(),
    name = dr["Gallery"].ToString(),
    address = dr["star"].ToString(),
    gender = dr["video"].ToString(),
    em = "",
    phone = someList
}

在这种情况下,someList可以是评估为List<Phone>的任何内容。例如:

new List<Phone>();

但是,看起来你正在从某种数据库记录中提取这些数据。你从哪里得到手机数据?在规范化结构中,您可能从单独的表中获取它,因此它不会成为dr对象的一部分。如果是这样的话,它在哪里?或者它是dr对象上字段中的分隔字符串值?

基本上,您有几个选择。如果您可以在当前上下文中获取电话数据,则可以将其转换为枚举以构建列表。例如,如果它是以管道分隔的字符串:

phone = dr["phones"].ToString().Split('|').Select(p => new Phone() { Section = p }).ToList()

这会抓取分隔的字符串,将其拆分为分隔符(将其转换为字符串的枚举),使用Select()将字符串的枚举转换为Phone个对象的枚举,并调用{ {1}}将该枚举计算为ToList()属性的列表。

另一方面,如果您无法从当前上下文获取电话数据,则可能需要循环显示该数据。如果是这种情况,那么你可以将你的单行phone变成几行:

.Add()

看一下这个结构,似乎必须有一些方式来获取var cont = new Cont() { sno = dr["Cinema"].ToString(), name = dr["Gallery"].ToString(), address = dr["star"].ToString(), gender = dr["video"].ToString(), em = "", phone = new List<Phone>(); }; foreach (var phone in someListOfPhones) cont.phone.Add(phone); ContCollection.Add(cont); 在该上下文中,但我们无法确定,因为你没有指定它。无论哪种方式,您的选择是从当前上下文生成电话列表或将代码分成多个语句以保持循环。

附注:我建议在someListOfPhones对象的构造函数中初始化phone属性:

Cont

这将允许使用代码访问该属性,而无需先手动初始化它,否则会导致public Cont() { phone = new List<Phone>(); }

答案 1 :(得分:0)

关于如何使用本机.NET 4.0将任何对象解析为JSON的示例

using System.Web.Script.Serialization;
public static class JsonParser() {
     public string ParseJson(object obj) {
     return new JavaScriptSerializer().Serialize(obj);
     }
}

至于你如何使用List这里取决于数据库的建模方式以及如何从数据库中检索值。

我希望你在这里使用ADO.NET。 在这种情况下,您需要创建第二个查询,以便在收到第一个数据后检索语音。 (你应该添加一些关于你如何做的代码。) 例如。从PhoneNumberTable中选择PhoneNumbers,其中ID =“--- yourId ---”

//Query code here
while(dr.read()) {
var cont = new Cont() { 
  sno = dr["Cinema"].ToString(),
//... and so on.
}
cont.PhoneNumbers = new List<Phone>();
//Add another query here to retrieve the phonenumbers for the current item.
while(dr2.read()) {
var pho = new PhoneNumber()
{ section = dr["Number"];}
cont.PhoneNumbers.Add(pho);
}
ContCollection.Add(cont);

}

上面的伪代码应该给你一个想法。