如何制作JSON数组?

时间:2018-10-19 15:37:40

标签: c# json json.net

我想要很多,但是我不怎么做那么多,我只能在这里像这样制作一个:

[
  {
    "NAME1": "Max1"
  }
]

但是我要这么做:

[
  {
    "NAME1": "Max1"
  },
  {
    "NAME2": "Max2"
  },
  {
    "NAME3": "Max3"
  },
  {
    "NAME4": "Max4"
  }
]

我该怎么做 这是我的代码:

public void nxt_Click(object sender, EventArgs e)
{
    List<Voc> _data = new List<Voc>();
    _data.Add(new Voc()
    {
        NAME = textBox1.Text
    });

    string jger2 = JsonConvert.SerializeObject(_data.ToArray(), Formatting.Indented);

    File.WriteAllText(@"D:\Users\Oxygen\Desktop\ss.json", jger2);    
}

public class Voc
{
    public string NAME { get; set; }
}

有人有什么主意吗?

2 个答案:

答案 0 :(得分:0)

首先,您的数组格式不正确。

应该是:

{
  "NAMES": [
    {
      "NAME": "Max1"
    },
    {
      "NAME": "Max2"
    },
    {
      "NAME": "Max3"
    },
    {
      "NAME": "Max4"
    }
  ]
}

通过json2Csharp.com运行该命令,它将生成以下内容:

public class NAME
{
    public string NAME { get; set; }
}

public class RootObject  //Rename this
{
    public List<NAME> NAMES { get; set; }
}

您应该几乎可以使用任何C#JSON库进行序列化和反序列化。

答案 1 :(得分:0)

以下fiddle中演示了几种方法。

第一个使用anonymous types,它们是没有真实类的对象,但是是通过为属性分配值来构造的。但是,要使用它们,您需要在编译时知道属性名称。因此,这只有在您确切知道数组中将包含多少个名称的情况下才有效。例如

var data = new object[] {
    new {Name1 = textBox1.Text}
    ,new {Name2 = textBox2.Text}
    ,new {Name3 = textBox3.Text}
    ,new {Name4 = textBox4.Text}
};

另一种方法是使用dictionary,可以在运行时填充名称/值对,然后将其转换为JSON。例如

var textBoxes = new [] {textBox1, textBox2, textBox3, textBox4};
var dict = new Dictionary<string,string>();
for (var i = 0; i< textBoxes.Length; i++) 
{
    dict.Add(string.Format("Name{0}", i), textBoxes[i].Text );
}

但是

我强烈建议您不要使用这些方法;或者更确切地说是这种方法。 JSON被设计为由键值对组成。它们的键应该是已知的,而值可以更改。这意味着如果一个名称具有4个不同的值,而不是持有4个不同的名称,则将这些值与该名称相对应;例如

{"Name": ["Max1","Max2","Max3","Max4"]}

...,其中元素的编号由数组的索引定义。

该C#如下所示:

SomeClass data = GetValues();
//...
public class SomeClass 
{
    public IEnumerable<string> Name {get;private set;}
    //or: public string[] Name {get;private set;}
    //...
}

如果您确实需要存储其他名称,则应将其存储为与名称键相对应的值;例如

[
    {"Name": "Name1", "Value": "Max1"}
    ,{"Name": "Name2", "Value": "Max2"}
    ,{"Name": "Name3", "Value": "Max3"}
    ,{"Name": "Name4", "Value": "Max4"}
]

该C#如下所示:

IEnumerable<SomeClass> data = GetValues();
//or: SomeClass[] data = GetValues();
//...

public class SomeClass 
{
    public string Name {get;private set;}
    public string Value {get;private set;}
    //...
}

完整代码

using System;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        //setup our test data
        var textBox1 = new TextBox("Max1");
        var textBox2 = new TextBox("Max2");
        var textBox3 = new TextBox("Max3");
        var textBox4 = new TextBox("Max4");

        //demo using anonymous objects (NB: property names must be known at compile time)
        var data = new object[] {
            new {Name1 = textBox1.Text}
            ,new {Name2 = textBox2.Text}
            ,new {Name3 = textBox3.Text}
            ,new {Name4 = textBox4.Text}
        };
        Console.WriteLine( JsonConvert.SerializeObject(data, Formatting.Indented));

        //demo using a dictionary
        var textBoxes = new [] {textBox1, textBox2, textBox3, textBox4};
        var dict = new Dictionary<string,string>();
        for (var i = 0; i< textBoxes.Length; i++) 
        {
            dict.Add(string.Format("Name{0}", i+1), textBoxes[i].Text );
        }
        Console.WriteLine("[" + string.Join(",", dict.Select( e => string.Format("{{\"{0}\": \"{1}\"}}", e.Key.Replace("\"","\"\""), e.Value.Replace("\"","\"\"") ) )) + "]"); //based on https://stackoverflow.com/questions/5597349/how-do-i-convert-a-dictionary-to-a-json-string-in-c/5597628#5597628
    }
}

//dummy class   
public class TextBox 
{
    public TextBox(string text){Text = text;}
    public string Text{get;private set;}
}