2016-07-11 5 views
0

Json.net으로 json 파일을 구문 분석하려고합니다. 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]; 

    } 

어떻게 수 I 키를하지 않고 모든 개별 항목을 반복?

+0

게시 한 JSON이 올바른가요? 그것은 2 차원 배열 ([] [])을 보여 주지만 중첩 된 배열의 내용은 대신 객체 인 것처럼 보입니다. 대신 대개 {}로 표시됩니다. – mtaanquist

+0

@MadsTaanquist json의 출처 : http://www.marinetraffic.com/nl/ais-api-services/documentation/api-service:27 –

답변

1

, 나는 그것이 좋은 해결책이라고 생각하지 않습니다. Marine Traffic API를 살펴본 결과, XML 표현에는 값에 대한 속성 이름이 분명히 있기 때문에 JSON 구현이 좋지 않은 것으로 느껴집니다. 이 배열은 2 차원 배열 인 중첩 배열, 어디가 아니기 때문에

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

, 우리는 대신 JSON 문자열을 가지고, 당신은 희망해야 할 것 : 그들의 JSON이있었습니다한다 인덱스를 사용하여 데이터를 검색해야하므로 데이터 모델은 무언가를 제거하기 위해 변경되지 않습니다.

그러나 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> 
} 

나는이가 도움이 되었기를 바랍니다. 질문이 있으시면 의견을 보내주십시오.

+0

이 위대한 설명에 감사드립니다! –

3

아마도 두 개의 중첩 된 foreach 문만 있으면됩니다. 이런 식으로 뭔가를 시도 :

diiN_의 대답은 질문에 대한 답 동안
foreach (var items in myObject) 
{ 
    foreach (var item in items) 
    { 
     // do something 
    } 
} 
관련 문제