我想在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文件数据的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬forEach循环并一一更新文档

在 do while 循环内部,我想在 c# 中每 1 分钟执行一次特定代码,直到条件满足

perl foreach 循环跳过特定文件夹下特定文件的迭代

c# winform 中循环控件

打破 foreach C#

我想在useEffect react Js中使用带有foreach的axios,但它给了我(无法读取属性Symbol(Symbol.iterator)错误?