【问题标题】:Json.NET - format an array of objects with namesJson.NET - 用名称格式化一组对象
【发布时间】:2017-01-03 21:23:13
【问题描述】:

我有一个这样的数组:

{
"214460106": {
    "HALTESTELLEN_ID": "214460106",
    "TYP": "stop",
    "DIVA": "60200001",
    "NAME": "Absberggasse",
    "GEMEINDE": "Wien",
    "GEMEINDE_ID": "90000",
    "WGS84_LAT": "48.1738010728644",
    "WGS84_LON": "16.3898072745249",
    "STAND": "",
    "PLATFORMS": [{
        "LINIE": "6",
        "ECHTZEIT": "1",
        "VERKEHRSMITTEL": "ptTram",
        "RBL_NUMMER": "406",
        "BEREICH": "0",
        "RICHTUNG": "H",
        "REIHENFOLGE": "16",
        "STEIG": "6-H",
        "STEIG_WGS84_LAT": "48.173825035357",
        "STEIG_WGS84_LON": "16.3894569315641"
    },
    {
        "LINIE": "6",
        "ECHTZEIT": "1",
        "VERKEHRSMITTEL": "ptTram",
        "RBL_NUMMER": "420",
        "BEREICH": "0",
        "RICHTUNG": "R",
        "REIHENFOLGE": "19",
        "STEIG": "6-R",
        "STEIG_WGS84_LAT": "48.1739867818893",
        "STEIG_WGS84_LON": "16.3898162576777"
    },
    {
        "LINIE": "N6",
        "ECHTZEIT": "1",
        "VERKEHRSMITTEL": "ptBusNight",
        "RBL_NUMMER": "406",
        "BEREICH": "0",
        "RICHTUNG": "H",
        "REIHENFOLGE": "13",
        "STEIG": "N6-H",
        "STEIG_WGS84_LAT": "48.1738010728644",
        "STEIG_WGS84_LON": "16.3892682853544"
    },
    {
        "LINIE": "N6",
        "ECHTZEIT": "1",
        "VERKEHRSMITTEL": "ptBusNight",
        "RBL_NUMMER": "420",
        "BEREICH": "0",
        "RICHTUNG": "R",
        "REIHENFOLGE": "6",
        "STEIG": "N6-R",
        "STEIG_WGS84_LAT": "48.1740406972867",
        "STEIG_WGS84_LON": "16.3896994766908"
    }],
    "LINES": ["6",
    "N6"]
},
"214460107": {
    "HALTESTELLEN_ID": "214460107",
    "TYP": "stop",
    "DIVA": "60200002",
    "NAME": "Achengasse",
    "GEMEINDE": "Wien",
    "GEMEINDE_ID": "90000",
    "WGS84_LAT": "48.2845258075837",
    "WGS84_LON": "16.4488984539143",
    "STAND": "",
    "PLATFORMS": [{
        "LINIE": "32A",
        "ECHTZEIT": "1",
        "VERKEHRSMITTEL": "ptBusCity",
        "RBL_NUMMER": "1168",
        "BEREICH": "0",
        "RICHTUNG": "H",
        "REIHENFOLGE": "7",
        "STEIG": "32A-H",
        "STEIG_WGS84_LAT": "48.284334521556",
        "STEIG_WGS84_LON": "16.4489523528313"
    },
    {
        "LINIE": "32A",
        "ECHTZEIT": "1",
        "VERKEHRSMITTEL": "ptBusCity",
        "RBL_NUMMER": "1159",
        "BEREICH": "0",
        "RICHTUNG": "R",
        "REIHENFOLGE": "35",
        "STEIG": "32A-R",
        "STEIG_WGS84_LAT": "48.2844540754073",
        "STEIG_WGS84_LON": "16.4509825453734"
    }],
    "LINES": ["32A"]
},
... and so on

有没有办法在List<class> 中格式化这样的内容?我试图这样做,但他总是停在 21460106 号码上。还尝试了 json2csharp,但这只会生成 5000 个类,其中每个类都以数字作为名称。

【问题讨论】:

  • 提供的 JSON 不是数组。它应该看起来像[{....}, {...}],而不是每个项目都是一个非常大的对象的属性,每个数字都是这个对象的属性。也许您可以更改生成的 JSON。
  • 我看到的问题是这不是一个数组,而是一个具有214460106214460107等属性的对象。

标签: c# .net json web json.net


【解决方案1】:

您的外部 JSON 容器不是一个数组,它是一个 JSON object:一组用大括号括起来的名称/值对,以逗号分隔。由于名称是任意键且不固定,因此反序列化它的最简单方法是作为字典。

类型:

public class PLATFORM
{
    public string LINIE { get; set; }
    public string ECHTZEIT { get; set; }
    public string VERKEHRSMITTEL { get; set; }
    public string RBL_NUMMER { get; set; }
    public string BEREICH { get; set; }
    public string RICHTUNG { get; set; }
    public string REIHENFOLGE { get; set; }
    public string STEIG { get; set; }
    public string STEIG_WGS84_LAT { get; set; }
    public string STEIG_WGS84_LON { get; set; }
}

public class RootObject
{
    public string HALTESTELLEN_ID { get; set; }
    public string TYP { get; set; }
    public string DIVA { get; set; }
    public string NAME { get; set; }
    public string GEMEINDE { get; set; }
    public string GEMEINDE_ID { get; set; }
    public string WGS84_LAT { get; set; }
    public string WGS84_LON { get; set; }
    public string STAND { get; set; }
    public List<PLATFORM> PLATFORMS { get; set; }
    public List<string> LINES { get; set; }
}

反序列化代码:

var dict = JsonConvert.DeserializeObject<Dictionary<long, RootObject>>(json);

我选择long 作为键类型,因为您的所有根属性名称看起来都是完整的字符串。如果没有,你可以使用Dictionary&lt;string, RootObject&gt;

为了生成RootObject 类,我将JSON 从根对象中的一个 值(在本例中为"214460106" 的值)复制到http://json2csharp.com/。 p>

示例fiddle

相关文档见:Deserialize a Dictionary

【讨论】:

    【解决方案2】:

    我不认为可以将数字用作字段,请尝试以字母字符开头,例如 A214460106。

    这只是一种快速测试格式是否正确的方法。 您可以从列表转换为 Json 字符串并转换回数据表,只是为了检查字符串是否正常工作,而无需使用模型。

      private void button1_Click(object sender, EventArgs e)
        {
            List<Employees> employees = new List<Employees>();
            Employees employee = new Employees();
            employee.firstName = "a";
            employees.Add(employee);
    
            string json = JsonConvert.SerializeObject(employees);
            DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));
        }
    
    
    
    }
    public class Employees
    {
        public string firstName { get; set; }
        public string lastName { get; set; }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 2023-03-08
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2014-02-23
      相关资源
      最近更新 更多