【问题标题】:how to develpoe nested loop format [duplicate]如何开发嵌套循环格式[重复]
【发布时间】:2014-03-10 14:34:11
【问题描述】:

我正在尝试开发以下格式的 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 
});

请大家解释一下

感谢和问候

【问题讨论】:

  • 你是如何从数据库中获取数据的,它是当前阅读器上的逗号分隔字段,你是否单独调用?
  • 我有单独的 db 方法
  • 你之前问题的答案有什么问题?
  • 我同意,其他问题的答案对我来说似乎是合理的。
  • 以前只有电话对象。但我需要电话是对象数组

标签: c# .net json


【解决方案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&lt;Phone&gt; 的东西。例如:

new List<Phone>();

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

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

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

这会抓取分隔的字符串,在分隔符上将其拆分(将其转换为字符串枚举),使用Select() 将字符串枚举转换为Phone 对象的枚举,并调用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,但我们无法确定,因为您尚未指定它。无论哪种方式,您的选择是从当前上下文生成电话列表,或者将代码分成多个语句以保持循环。

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

public Cont()
{
    phone = new List<Phone>();
}

这将允许消费代码访问该属性而无需先手动初始化它,否则会导致NullReferenceException

【讨论】:

    【解决方案2】:

    关于如何使用本机 .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);
    
    }
    

    上面的伪代码应该会给你一个思路。

    【讨论】:

    • 感谢您给予伟大的科
    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2017-09-30
    • 2010-10-13
    相关资源
    最近更新 更多