如何将 JArray 的所有元素添加到 C# 中的 JObject?

Posted

技术标签:

【中文标题】如何将 JArray 的所有元素添加到 C# 中的 JObject?【英文标题】:How would you add all elements of a JArray to a JObject in C#? 【发布时间】:2021-12-18 22:23:01 【问题描述】:

我正在尝试将 JArray 的元素添加到 C# 中的 JObject 中。我有 Java 中的解决方案,但无法弄清楚如何在 C# 中做同样的事情。这是我的 Java 代码:

 public static JSONObject[] fetchData(String dataFile, String arrayName) 
    JSONArray jsonArray;
    try 
        jsonArray = extractObject_JSON(dataFile).getJSONArray(arrayName);
     catch (Exception e) 
        // If Method Name is not matching with arrayName, then default will be taken
        jsonArray = extractObject_JSON(dataFile).getJSONArray("default");
    
    JSONObject[] jsonObject = new JSONObject[jsonArray.length()];
    for (int i = 0; i < jsonArray.length(); i++) 
        jsonObject[i] = jsonArray.getJSONObject(i);
    
    return jsonObject;

这是我的 C# 代码:

public static JObject FetchData(string testMethodName)


    using (StreamReader r = new StreamReader("PathToFile"))
    
        string jsonstring = r.ReadToEnd();
        JObject obj = JObject.Parse(jsonstring);
        JArray jsonArray = JArray.Parse(obj[testMethodName].ToString());

        JObject jObject = new JObject();
        for (int i = 0; i < jsonArray.Count; i++)
        
            jObject[i] = jsonArray[i];

        

        return jObject;
    


jsonArray 在此代码示例中返回:

[
  
    "loginId": "testuser1",
    "userCase": "verify for user"
  ,
  
    "loginId": "testuser2",
    "userCase": "verify for user"
  
]

testMethodName 将是 LoginTest_E2E(请参阅下面的 .json 输入文件)

   
      "LoginTest_E2E": [
        
          "loginId": "testuser1",
          "userCase": "verify for user"
        ,
        
          "loginId": "testuser2",
          "userCase": "verify for user"
        
      ]
    

当我运行我的 C# 代码时,我收到以下错误:

System.ArgumentException: '使用无效键值设置 JObject 值:0。预期对象属性名称。'

我希望 fetchData 方法返回 JObject 的:

  
    "loginId": "testuser1",
    "userCase": "verify for user"
  ,
  
    "loginId": "testuser2",
    "userCase": "verify for user"
  

有人知道如何用 C# 解决这个问题吗?

【问题讨论】:

我注意到您在两个小时前问过very similar looking question,但没有得到答复。这篇文章有根本的不同吗? 我认为您期望的最终结果不是有效的 JSON。数组有索引,对象有属性。考虑到你有这个结果,你将如何访问第一个元素?您不能使用索引,因为它不是数组,也没有属性名称。也许如果您分享您想要这样做的实际原因,您可能会得到更有用的答案。 同样在 Java 代码中你有一个 JsonObjects 数组,在 C# 代码中你只有一个 JObject 实例。 感谢@SelmanGenç 我认为这是我想在 C# 中复制 Java 代码的地方。你知道我将如何在我的 C# 示例中创建一个 jsonObjects 数组吗? @SelmanGenç 这个 fetchData 方法将用于为数据驱动的 NUnit 测试获取数据 【参考方案1】:

正如你所写的,jObject 期望你添加到它的属性的键的字符串值。从 JObject 扩展 IDictionary 的事实来看,至少这是我的理解:https://www.newtonsoft.com/json/help/html/t_newtonsoft_json_linq_jobject.htm

你试图给它一个整数值作为键。从您的 Java 代码来看,您似乎打算声明一个 JObject 数组,但您只是在这里声明了一个:

JObject jObject = new JObject();

如果是这种情况,请按照@Selman 所说,将其更改为 JObject[]。

【讨论】:

以上是关于如何将 JArray 的所有元素添加到 C# 中的 JObject?的主要内容,如果未能解决你的问题,请参考以下文章

如何结合Jarray?

c#如何把json值转化成jarray

如何在不添加新 JObject 键/名称的情况下将 JArray 添加到 JObject 中?

C# JArray与JObject 的使用

如何访问 JArray 的元素(或迭代它们)

c# 读取json的问题,JObject不能强转成JArray