[英]Iterate Through JSON Array in C#
我試圖弄清楚如何遍歷一些JSON數據以將其插入到DataGrid中,以用作事件日志。 但是嘗試解析JSON讓我頭疼。
我正在嘗試使用Newtonsoft的JSON.NET。
JSON字符串如下所示;
{
"result" : "ok",
"response" : {
"first" : 0,
"count" : 190,
"now" : 1509822169,
"events" : [
{
"index" : 0,
"time" : 1509815973,
"name" : "SessionCreated",
"attributes" : {}
},
{
"index" : 1,
"time" : 1509815973,
"name" : "PlayerJoined",
"refid" : 32896,
"attributes" : {}
"Name" : "Dealman",
"SteamId" : "76561197986562417"
},
{
"index" : 2,
"time" : 1509815973,
"name" : "Authenticated",
"refid" : 32896,
"attributes" : {}
},
{
"index" : 3,
"time" : 1509815973,
"name" : "StateChanged",
"attributes" : {}
"PreviousState" : "None",
"NewState" : "Lobby"
},
{
"index" : 4,
"time" : 1509815998,
"name" : "PlayerChat",
"refid" : 32896,
"attributes" : {
"Message" : "This is a message"
}
},
{
"index" : 5,
"time" : 1509816030,
"name" : "StateChanged",
"attributes" : {}
"PreviousState" : "Lobby",
"NewState" : "Loading"
},
{
"index" : 6,
"time" : 1509816030,
"name" : "SessionSetup",
"attributes" : {}
"GridSize" : 22,
"MaxPlayers" : 22,
"PracticeLength" : 0,
"QualifyLength" : 15,
"RaceLength" : 6,
"Flags" : -1316224232,
"TrackId" : -52972612,
"GameMode" : -1958878043
},
{
"index" : 7,
"time" : 1509816030,
"name" : "StageChanged",
"attributes" : {
"PreviousStage" : "Practice1",
"NewStage" : "Qualifying1",
"Length" : 15
}
},
{
"index" : 8,
"time" : 1509816046,
"name" : "StateChanged",
"attributes" : {
"PreviousState" : "Loading",
"NewState" : "Race"
}
},
{
"index" : 9,
"time" : 1509816046,
"name" : "ParticipantCreated",
"refid" : 32896,
"participantid" : 0,
"attributes" : {
"Name" : "Dealman",
"IsPlayer" : 1,
"VehicleId" : 1764851930,
"LiveryId" : 54
}
}]}
}
我一直在嘗試做這樣的事情;
dynamic jsonObj = JsonConvert.DeserializeObject(messageContent);
foreach(var item in jsonObj)
{
Trace.WriteLine(item.result);
}
我還嘗試了其他一些方法,例如使用列表,但是我根本無法使它正常工作,並且不斷收到RuntimeBinderException 。 我已經被這個問題困擾了很長時間了,以至於我開始考慮只使用正則表達式,因為這似乎要花很多功夫。
我在這里想念和/或誤解了什么? :(
var json = @"...";
var obj = ToObject(json) as IDictionary<string, object>;
var resp = obj["response"] as IDictionary<string, object>;
var events = resp["events"];
public static object ToObject(string json)
{
if (string.IsNullOrEmpty(json))
return null;
return ToObject(JToken.Parse(json));
}
private static object ToObject(JToken token)
{
switch (token.Type)
{
case JTokenType.Object:
return token.Children<JProperty>()
.ToDictionary(prop => prop.Name,
prop => ToObject(prop.Value),
StringComparer.OrdinalIgnoreCase);
case JTokenType.Array:
return token.Select(ToObject).ToList();
default:
return ((JValue)token).Value;
}
}
json字符串將轉換為Dictionary,其中項是簡單值,列表或嵌套字典。 迭代字典比使用反射要容易得多。
順便說一句,您的json中有一個錯誤-“ attributes”:{}后缺少逗號。 同樣,同時具有“名稱”和“名稱”作為屬性也不是一個好主意。
您遇到的問題是因為result
是一個頂級屬性,它不是集合的一部分,因此嘗試使用循環訪問它沒有任何意義。 這將打印ok
預期:
using Newtonsoft.Json;
using System;
using System.IO;
namespace SO47114632Core
{
class Program
{
static void Main(string[] args)
{
var content = File.ReadAllText("test.json");
dynamic json = JsonConvert.DeserializeObject(content);
Console.WriteLine(json.result);
}
}
}
我在項目的根文件夾中添加了test.json
和問題中的JSON,並在文件屬性中將“ Copy to Output Directory
設置為“ Always
”:
public static ExpandoObject ToExpando(string json)
{
if (string.IsNullOrEmpty(json))
return null;
return (ExpandoObject)ToExpandoObject(JToken.Parse(json));
}
private static object ToExpandoObject(JToken token)
{
switch (token.Type)
{
case JTokenType.Object:
var expando = new ExpandoObject();
var expandoDic = (IDictionary<string, object>)expando;
foreach(var prop in token.Children<JProperty>())
expandoDic.Add(prop.Name, ToExpandoObject(prop.Value));
return expando;
case JTokenType.Array:
return token.Select(ToExpandoObject).ToList();
default:
return ((JValue)token).Value;
}
}
var ebj = ToExpando(json);
var name = (ebj as dynamic).response.events[1].name;
使用動態的更好(更易於使用)的版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.