С Cinchoo ETL - библиотекой с открытым исходным кодом, вы можете легко выполнить преобразование с помощью нескольких строк кода
string json = @"{
""paging"": {
""limit"": 100,
""total"": 1394,
""next"": ""Mg==""
},
""data"": [
{
""mmsi"": 538006090,
""imo"": 9700665,
""last_known_position"": {
""timestamp"": ""2017-12-18T20:24:27+00:00"",
""geometry"": {
""type"": ""Point"",
""coordinates"": [
60.87363,
-13.02203
]
}
}
},
{
""mmsi"": 527555481,
""imo"": 970000,
""last_known_position"": {
""timestamp"": ""2017-12-18T20:24:27+00:00"",
""geometry"": {
""type"": ""Point"",
""coordinates"": [
4.57883,
3.76899
]
}
}
}
]
}
";
StringBuilder sb = new StringBuilder();
using (var p = ChoJSONReader.LoadText(json)
.WithJSONPath("$..data")
)
{
using (var w = new ChoXmlWriter(sb)
.Configure(c => c.RootName = "vessel")
.Configure(c => c.NodeName = "row")
)
{
w.Write(p.Select(r => new { _mmsi = r.mmsi, _imo = r.imo, _lat = r.last_known_position.geometry.coordinates[0], _lon = r.last_known_position.geometry.coordinates[1] }));
}
}
Console.WriteLine(sb.ToString());
Вывод:
<vessel>
<row mmsi="538006090" imo="9700665" lat="60.87363" lon="-13.02203" />
<row mmsi="527555481" imo="970000" lat="4.57883" lon="3.76899" />
</vessel>
За дополнительной информацией обратитесь к статье CodeProject.
ОБНОВЛЕНИЕ:
Чтобы обработать специальное условие нулевого значения, вы можете написать так:
string json = @"{
""paging"": {
""limit"": 100,
""total"": 1394,
""next"": ""Mg==""
},
""data"": [
{
""mmsi"": 538006090,
""imo"": 9700665,
""last_known_position"": {
""timestamp"": ""2017-12-18T20:24:27+00:00"",
""geometry"": {
""type"": ""Point"",
""coordinates"": [
60.87363,
-13.02203
]
}
}
},
{
""mmsi"": 527555481,
""imo"": null,
""last_known_position"": {
""timestamp"": ""2017-12-18T20:24:27+00:00"",
""geometry"": {
""type"": ""Point"",
""coordinates"": [
4.57883,
3.76899
]
}
}
}
]
}
";
StringBuilder sb = new StringBuilder();
using (var p = ChoJSONReader.LoadText(json)
.WithJSONPath("$..data")
)
{
using (var w = new ChoXmlWriter(sb)
.Configure(c => c.RootName = "vessel")
.Configure(c => c.NodeName = "row")
)
{
w.Write(p.Select(r => new { _mmsi = r.mmsi, _imo = r.imo == null ? "null" : r.imo, _lat = r.last_known_position.geometry.coordinates[0], _lon = r.last_known_position.geometry.coordinates[1] }));
}
}
Console.WriteLine(sb.ToString());
Вывод:
<vessel>
<row mmsi="538006090" imo="9700665" lat="60.87363" lon="-13.02203" />
<row mmsi="527555481" imo="null" lat="4.57883" lon="3.76899" />
</vessel>
Отказ от ответственности: я являюсь автором этой библиотеки.