首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从表单上的一系列动态创建的文本框中向JSON数组添加元素

如何从表单上的一系列动态创建的文本框中向JSON数组添加元素
EN

Stack Overflow用户
提问于 2019-04-01 23:14:45
回答 1查看 0关注 0票数 0

我有一个带有两个按钮的表格,button1button2。每当我推送button2,表单中都会添加两个文本框,一个表示“名称”,另一个表示ISP的“ipAddresses”。 这是按下按钮两次时的样子:

按两次按钮后形成
按两次按钮后形成

当我推送时button1,我想从文本框中读取值并将它们序列化为JSON文件。JSON应该如下所示:

代码语言:javascript
复制
{
  "header": {
    "isp": [
      {
        "name": "smth",
        "ipAddresses": "smth"
      },
      {
        "name": "smth",
        "ipAddresses": "smth"
      }
    ]
  }
}

我创建新文本框的代码正在运行,但是我无法从新文本框中获取值并将它们添加到JSON中。我试图按照我的理解去做 这是的地方崩溃我的代码:

代码语言:javascript
复制
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public int i = 0;
    public int a;
    List<TextBox> textBoxes = new List<TextBox>();
    public class Isp
    {
        public List<string> name { get; set; }
        public List<string> IPAddresses { get; set; }
    }
    public class test
    {
        public  List<Isp> isp { get; set; }
    }
    private void button2_Click(object sender, EventArgs e)
    {
        if (i < 10)
        {
            textBoxes.Add(new TextBox());
            textBoxes[i].Name = "TextBox" + i.ToString();
            textBoxes[i].Location = new Point(90, 10 + i * 25);
            textBoxes[i].Size = new System.Drawing.Size(298, 20);
            textBoxes[i].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                | System.Windows.Forms.AnchorStyles.Right)));
            this.Controls.Add(textBoxes[i]);
            i++;
            textBoxes.Add(new TextBox());
            textBoxes[i].Name = "TextBox" + i.ToString();
            textBoxes[i].Location = new Point(90, 10 + i * 25);
            textBoxes[i].Size = new System.Drawing.Size(298, 20);
            textBoxes[i].Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));
            this.Controls.Add(textBoxes[i]);
            i++;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();// это часть магии для сохранения файла,вывод окно с выбором куда и с каким именем сохранять. её просто копировать
        saveFileDialog1.Filter = "JSON files(*.json)|*.json|All files(*.*)|*.*";
        if (saveFileDialog1.ShowDialog() == DialogResult.Cancel)
        {
            return;
        }
        Isp isp = new Isp { };
        a = 1;
        foreach (TextBox textBox in textBoxes)
        {
            if (a / 2 != 0)
            {
                isp.name.Add(textBox.Text);
            }
            else if (a/2 == 0)
            {
                isp.IPAddresses.Add(textBox.Text);
            }
            a++;
        }
        string json = JsonConvert.SerializeObject(isp, Formatting.Indented);//завершающая часть сохранения файла
        string filename = saveFileDialog1.FileName;
        System.IO.File.WriteAllText(filename, json);
        // System.Console.WriteLine(json);//вывод
        MessageBox.Show("Файл сохранен", "Успех!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }
}

哪里错了呢

EN

回答 1

Stack Overflow用户

发布于 2019-04-02 08:41:24

第一个问题是您的模型类与您要创建的JSON的结构不匹配。用以下内容替换您的Isptest类:

代码语言:javascript
复制
public class RootObject
{
    public RootObject()
    {
        Header = new Header();
    }

    [JsonProperty("header")]
    public Header Header { get; set; }
}

public class Header
{
    public Header()
    {
        IspList = new List<Isp>();
    }

    [JsonProperty("isp")]
    public List<Isp> IspList { get; set; }
}

public class Isp
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("ipAddresses")]
    public string IPAddresses { get; set; }
}

当您填写的模型,你需要添加一个IspIspList每两个TextBoxesTextBox每对中的第一个将包含Name,第二个将包含IPAddresses。你可以像这样写:

代码语言:javascript
复制
RootObject root = new RootObject();

for (int j = 0; j < textBoxes.Count; j += 2)  // count by 2
{
    Isp isp = new Isp();

    isp.Name = textBoxes[j].Text;
    isp.IPAddresses = textBoxes[j + 1].Text;

    root.Header.IspList.Add(isp);
}

最后,要创建完整的JSON,您需要序列化RootObject

代码语言:javascript
复制
string json = JsonConvert.SerializeObject(root, Formatting.Indented);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档