我想在c#中使用foreach循环一一读取具有特定json对象数组的json文件数据
Posted
技术标签:
【中文标题】我想在c#中使用foreach循环一一读取具有特定json对象数组的json文件数据【英文标题】:I want to read json file data with specific json object array one by one using foreach loop in c# 【发布时间】:2022-01-05 11:00:53 【问题描述】:谁能帮我解决以下问题:
我有以下 JSON,它由几个 AA、BB、CC 对象数组组成,每个数组都有其对应的 KEY“ts”和 VALUE“value”对象。
"AA": [
"ts": 1636862399574,
"value": "2021-11-14 00:57:25.049983"
,
"ts": 1636862398995,
"value": "2021-11-14 00:57:24.049979"
],
"BB": [
"ts": 1636862399574,
"value": "16183.8"
,
"ts": 1636862398995,
"value": "16183.8"
],
"CC": [
"ts": 1636862399574,
"value": "0.0"
,
"ts": 1636862398995,
"value": "0.0"
]
我在 C# 中的代码 sn-p:
List<List<DateTime>> ArrayAA;
List<List<double>> ArrayBB;
List<List<double>> ArrayCC;
for (int i = 0; i < devices.Count; i++)
var data = JsonConvert.DeserializeObject(json);
if (data != null)
// Then deserialize your json to Dictionary<string, List<MyObject>>
var myDictionary = JsonConvert.DeserializeObject<Dictionary<string, List<MyObject>>>(JSONdata);
foreach (KeyValuePair<string, List<MyObject>> entry in myDictionary)
foreach (var obj in entry.Value)
Console.WriteLine($"entry.Key -> ts: obj.TS, value: obj.Value");
ArrayAA[i].Add(obj.value);
ArrayBB[i].Add(obj.value);
ArrayCC[i].Add(obj.value);
我的代码不起作用,我需要一次读取每个 AA、BB、CC 的所有值。
有可能吗?
【问题讨论】:
是的...反序列化为字符串字典和对象 lisylt 不工作是什么意思? 显示的错误::异常引发:Newtonsoft.Json.dll 中的“System.InvalidOperationException” 每一项 [AA] 或 BB 都是一个数组...不是一个对象 【参考方案1】:您应该首先将您的对象反序列化为字典。这样,您可以遍历您拥有的每个键。一旦你有了字典......你可以打印任何你喜欢的值。
这是一个示例,向您展示如何访问每个键的值,“AA”、“BB”、“CC”等。
// Build your object class first.
public class MyObject
[JsonProperty("ts")]
public long TS get; set;
[JsonProperty("value")]
public string Value get; set;
// Then deserialize your json to Dictionary<string, List<MyObject>>
var myDictionary = JsonConvert.DeserializeObject<Dictionary<string, List<MyObject>>>(jsonText);
foreach (KeyValuePair<string, List<MyObject>> entry in myDictionary)
foreach (var obj in entry.Value)
Console.WriteLine($"entry.Key -> ts: obj.TS, value: obj.Value");
List<DateTime> arrayAA = myDictionary["AA"].Select(x => DateTime.Parse(x.Value)).ToList();
List<double> arrayBB = myDictionary["BB"].Select(x => double.Parse(x.Value)).ToList();
List<double> arrayCC = myDictionary["CC"].Select(x => double.Parse(x.Value)).ToList();
// Prints the following output
AA -> ts: 1636862399574, value: 2021-11-14 00:57:25.049983
AA -> ts: 1636862398995, value: 2021-11-14 00:57:24.049979
BB -> ts: 1636862399574, value: 16183.8
BB -> ts: 1636862398995, value: 16183.8
CC -> ts: 1636862399574, value: 0.0
CC -> ts: 1636862398995, value: 0.0
更新 - 如何添加项目? 如果您想向数据中添加项目...您需要知道要将项目添加到哪个 Key。
string key = "AA";
if (myDictionary.ContainsKey(key))
myDictionary[key].Add(new MyObject() TS = 651651651651, Value = "abc" );
// or get only the values and save them in separate arrays? use LINQ
string[] arrayAA = myDictionary["AA"].Select(x => x.Value).ToArray();
string[] arrayBB = myDictionary["BB"].Select(x => x.Value).ToArray();
【讨论】:
它 100% 有效。这是我一直在寻找的优化解决方案。非常感谢:) 如何填充每个 ArrayXX [i] 数组? @ingezone 请参阅上面的更新。 请看我更新的C#代码sn-p。 @ingezone 不起作用。您正在循环中初始化数组..每次都会被覆盖。想想你首先要做什么。【参考方案2】:有几种方法可以做到这一点,其中一种是使用JObject
类
JObject data = JObject.Parse(json);
if (data != null)
var itemsA = data["AA"].Select(i => i["value"]);
foreach(var item in itemsA)
Console.WriteLine("Value: " + item);
//and BB and CC.....................................
或
JObject data = JObject.Parse(json);
Console.WriteLine("Value: " + data["AA"][0]["value"]);
Console.WriteLine("Value: " + data["AA"][1]["value"]);
//.......................................
Console.WriteLine("Value: " + data["BB"][0]["value"]);
您可以使用动态数据类型或打包到特定的类中。
【讨论】:
【参考方案3】:另一种方法是基于 json 字符串创建类并反序列化到该类
using Newtonsoft.Json;
public class MyRootClass
public List<AA> AA get; set;
public List<AA> BB get; set;
public List<AA> CC get; set;
public class AA
public long ts get; set;
public string value get; set;
public class BB
public long ts get; set;
public string value get; set;
public class CC
public long ts get; set;
public string value get; set;
string json = "yourJson";
var myObject = JsonConvert.DeserializeObject<MyRootClass>(json);
并阅读它。循环遍历 myobject 中的每个列表
foreach (var item in myObject.AA)
Console.WriteLine(item.value);
Console.WriteLine(item.ts);
【讨论】:
以上是关于我想在c#中使用foreach循环一一读取具有特定json对象数组的json文件数据的主要内容,如果未能解决你的问题,请参考以下文章
在 do while 循环内部,我想在 c# 中每 1 分钟执行一次特定代码,直到条件满足
perl foreach 循环跳过特定文件夹下特定文件的迭代
我想在useEffect react Js中使用带有foreach的axios,但它给了我(无法读取属性Symbol(Symbol.iterator)错误?