Json.NET - 格式化带有名称的对象数组
Json.NET - format an array of objects with names
我有一个这样的数组:
{
"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 classes,其中每个 class 的名称都是数字。
我认为不能将数字用作字段,请尝试以字母字符开头,例如 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; }
}
您的外部 JSON 容器不是一个数组,它是一个 JSON object:一组用大括号括起来的逗号分隔的 name/value 对。由于名称是任意键而不是固定的,因此反序列化它的最简单方法是作为字典。
类型:
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<string, RootObject>
。
为了生成 RootObject
class,我从根对象中的 一个 值中复制了 JSON -- 的值"214460106"
在这种情况下——到 http://json2csharp.com/.
示例 fiddle.
有关相关文档,请参阅:Deserialize a Dictionary。
我有一个这样的数组:
{
"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 classes,其中每个 class 的名称都是数字。
我认为不能将数字用作字段,请尝试以字母字符开头,例如 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; }
}
您的外部 JSON 容器不是一个数组,它是一个 JSON object:一组用大括号括起来的逗号分隔的 name/value 对。由于名称是任意键而不是固定的,因此反序列化它的最简单方法是作为字典。
类型:
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<string, RootObject>
。
为了生成 RootObject
class,我从根对象中的 一个 值中复制了 JSON -- 的值"214460106"
在这种情况下——到 http://json2csharp.com/.
示例 fiddle.
有关相关文档,请参阅:Deserialize a Dictionary。