解析没有键值的json文件

时间:2016-07-11 11:45:56

标签: c# json asp.net-mvc json.net

我正在尝试使用Json.net解析json文件。 json文件的内容是:

[
  [ "240521000", "37.46272", "25.32613", "0", "71", "90", "15", "2016-07-18T21:09:00" ],
  [ "237485000", "37.50118", "25.23968", "177", "211", "273", "8", "2015-09-18T21:08:00" ]
]

我创建了以下代码:

    WebClient wc = new WebClient();
    string json = wc.DownloadString("data.json");
    dynamic myObject = JsonConvert.DeserializeObject<dynamic>(json);

    foreach (string item in myObject[0])
    {
        var x = item[0];

    }

如何在没有钥匙的情况下循环浏览所有单个项目?

2 个答案:

答案 0 :(得分:3)

您可能只需要两个嵌套的foreach语句。尝试这样的事情:

foreach (var items in myObject)
{
    foreach (var item in items)
    {
        // do something
    }
}

答案 1 :(得分:1)

虽然diiN的回答回答了这个问题,但我认为这不是一个好的解决方案。看过Marine Traffic API之后,感觉他们做了一个糟糕的JSON实现,因为XML表示清楚地具有值的属性名称。他们的JSON应该是:

{"positions": ["position": {"mmsi": "311029000", "lat": "37.48617", "long": "24.37233", ...}]}

因为它不是,我们有一个JSON字符串,而不是它是一个嵌套数组,其中数组是一个二维数组,你不得不希望数据模型不是&# 39; t已更改为删除某些内容,因为您必须使用索引来检索数据。

但是,如果查看API中提供的XML,则属性具有名称。我建议您下载XML,然后将其解析为一个对象 - 一个ASP.NET中的模型 - 它是强类型的,可以在View中更轻松地使用。

这是我运行的一个例子。它使用XML解析首先从API读取XML,然后将其解析为JSON,最后解析为实际对象。

首先,模型类(Position.cs)

public sealed class Position
{
    [JsonProperty("@MMSI")]
    public string MMSI { get; set; }
    [JsonProperty("@LAT")]
    public string Latitude { get; set; }
    [JsonProperty("@LON")]
    public string Longitude { get; set; }
    [JsonProperty("@SPEED")]
    public string Speed { get; set; }
    [JsonProperty("@HEADING")]
    public string Heading { get; set; }
    [JsonProperty("@COURSE")]
    public string Course { get; set; }
    [JsonProperty("@STATUS")]
    public string Status { get; set; }
    [JsonProperty("@TIMESTAMP")]
    public string TimeStamp { get; set; }
}

接下来,解析逻辑:

var client = new WebClient();
var xml = client.DownloadString("data.xml");
var doc = new XmlDocument();
doc.LoadXml(xml);

var json = JsonConvert.SerializeXmlNode(doc);
var positions = JObject.Parse(json).SelectToken("pos").SelectToken("row").ToObject<List<Position>>();

在解析逻辑结束时,您现在有一个可以传递给视图的位置列表,并且可以强类型化。

作为一个简短的例子:

// after you have the positions list
return View(positions);

<强> Positions.cshtml

@model List<Positions>

<h2>Positions</h2>
@foreach (var position in Model)
{
    <p>@position.MMSI (@position.Latitude, @position.Longitude)</p>
}

我希望这对你有用。如果您有任何问题,请给我发表评论。