【问题标题】:Noob using C# classes and accessing themNoob 使用 C# 类并访问它们
【发布时间】:2015-01-28 00:18:05
【问题描述】:

我正在使用 JSON(使用 json.net)和 C# 控制台应用程序,我正在尝试为服务器设置一些 JSON POST 值。

我可以设置一些值,但访问其他值让我很适应。

我的 JSON 如下所示:

{
    "params" : [
         {
             "url" : "sys/login/user",
             "data" : [
                 {
                     "passwd" : "pwd",
                     "user" : "user"
                 }
             ]
         }
    ],
    "session" : 1,
    "id" : 1,
    "method" : "exec"
}

我通过 json2csharp 运行它,它为我生成了以下类。

public class Datum
{
    public string passwd { get; set; }
    public string user { get; set; }
}

public class Param
{
    public string url { get; set; }
    public List<Datum> data { get; set; }
}

public class RootObject
{
    public List<Param> @params { get; set; }
    public string session { get; set; }
    public int id { get; set; }
    public string method { get; set; }
}

然后我创建了这个对象以在我的 Main 方法中进行测试

RootObject temp = new RootObject()
temp.id = 1;
temp.method = "exec";
temp.session = "1";

这些参数设置得很好。 我还可以使用以下设置 URL 参数:

temp.@params.Add(new Param { url = "some/url", });

设置public List&lt;Datum&gt; data { get; set; } 是问题所在。我不知道如何访问它并设置用户和密码项。

如果我将它添加到 Param 类中,我可以设置值,但这对我来说似乎是错误的方式/位置。

public Param()
{
   data = new List<Datum>();            
   data.Add(new Datum { user = "user", passwd = "pass" });
}      

【问题讨论】:

  • 您的问题标题应该是对问题的描述,而不是(您认为适用的)您自己的描述。
  • 欢迎来到 Stackoverflow。鉴于这是您的第一个问题,我建议您阅读How to Ask,了解有关此处提问的最佳方式的信息。您的问题对于新手来说非常好,但它可能需要一些改进。例如,标题非常模糊,几乎没有有用的信息。
  • 首先,我至少将属性@params 更改为其他内容。 json2csharp 已将 @ 放在名称的开头,因为 params 是 C# 关键字 - 请参阅 C# language spec 2.4.2: Identifiers
  • 请说明为什么对您来说“这似乎是错误的方式/地点”。当你这样做时,有什么特别不起作用的吗?在不知道这一点的情况下,很难提出没有相同问题的替代方案。
  • @WaiHaLee:因为它是这样工作的(这正是 @ 语法元素被引入 C# 的原因),并且,看到 JSON 连接,这可能正在处理一些基于反射的序列化/反序列化,该建议最有可能破坏某些东西而不是减少麻烦。

标签: c# json serialization


【解决方案1】:

好吧,你可以像这样创建你的RootObject

RootObject temp = new RootObject()
temp.id = 1;
temp.method = "exec";
temp.session = "1";

然后创建params 列表并用一个Param 填充它:

temp.@params = new List<Param>();
temp.@params.Add(new Param { url = "some/url" });

然后您可以为列表中的一个参数设置数据(在本例中为第一个):

temp.@params[0].data = new List<Datum>();
temp.@params[0].data.Add(new Datum { user = "user", passwd = "pass" });

这是必要的,因为@paramsParam 对象的列表。您还可以在创建 Param 实例时填充数据,然后再将其添加到列表中(更简单,因为您需要知道列表索引)。

temp.@params = new List<Param>();

Param p = new Param { url = "some/url" };
p.data = new List<Datum>();
p.data.Add(new Datum() { ... });

temp.@params.Add(p);

通常您会更改默认构造函数以初始化列表并通过将属性更改为只读来防止列表实例被替换,但这可能不适用于 JSON 反序列化,因此您确实需要尝试这个。它看起来像这样:

public class Param
{
    public Param()
    {
        data = new List<Datum>();
    }

    public string url { get; set; }
    public List<Datum> data { get; private set; }
}

public class RootObject
{
    public RootObject()
    {
        @params = new List<Param>();
    }

    public List<Param> @params { get; private set; }
    public string session { get; set; }
    public int id { get; set; }
    public string method { get; set; }
}

【讨论】:

  • 您应该为只读属性提供私有设置器,否则将产生CS0840
  • 非常感谢!这正是我前进所需要的。也感谢关于私人二传手的提示,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多