簡體   English   中英

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

[英]How would you add all elements of a JArray to a JObject in C#?

我正在嘗試將JArray的元素添加到JObject中的 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。應為 Object 屬性名稱。”

我希望fetchData方法返回一個JObject

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

C#有人知道怎么解決嗎?

正如您所寫的那樣,jObject 期望您添加到它的屬性的鍵的字符串值。 至少從 JObject 擴展 IDictionary<string, JToken> 的事實來看,這是我的理解: https ://www.newtonsoft.com/json/help/html/t_newtonsoft_json_linq_jobject.htm

你試圖給它一個整數值作為鍵。 從您的 Java 代碼來看,您似乎打算聲明一個 JObject 數組,但您只是在此處聲明了一個:

JObject jObject = new JObject();

如果是這種情況,請按照@Selman 所說將其更改為 JObject[]。

有兩種不同的類型 JArray 和 JObject。 您不能只將數組作為 JObject 返回。 您可以返回或 JArray 或 JObject[]。 不要混淆。 JObject[] 不是 Json 數組,它是 Json 對象的 C# 數組。

public static JObject[] FetchData(string testMethodName, string pathToFile)
{

    string json = string.Empty;
    using (StreamReader r = new StreamReader(@pathToFile))
        json = r.ReadToEnd();
    JObject obj = JObject.Parse(json);
    JArray jsonArray = JArray.Parse(obj[testMethodName].ToString());

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

    return jObjects;
}

或使用 linq

public static JObject[] FetchData(string testMethodName, string filePath)
{
    string json = string.Empty;
    using (StreamReader r = new StreamReader(@fileToPath))
        json = r.ReadToEnd();
    JObject obj = JObject.Parse(json);
   var ja= JArray.Parse( obj[testMethodName].ToString() );
    return  ja.Select(j => JObject.Parse(j.ToString()) ).ToArray();
}

輸出

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM