C#中的JSON解析项不是一个数组。

6

我正在尝试解析一个JSON字符串,它看起来像这样:

{
    "totalCreditsRemoved": 1,
    "invalidReceivers": [],
    "ids": [100070531],
    "validReceivers": ["+33635938286"]
}

我从一个Web API中获取到这个数据,并将其储存在一个字符串中:

var reader = new StreamReader(respStream);
String result = reader.ReadToEnd().Trim();
response = result;

响应是一个公共字符串。

然后,在另一个方法中:我尝试解析我的json字符串:

var json = response;
var objects = JArray.Parse(json);

foreach (JObject root in objects)
{
    foreach (KeyValuePair<String, JToken> app in root)
    {
        totalCreditsRemoved = (String)app.Value["totalCreditsRemoved"];
        invalidReceivers = (String)app.Value["invalidReceivers"];
        ids = (String)app.Value["ids"];
        validReceivers = (String)app.Value["validReceivers"];
    }
}

但我总是遇到这个错误:

JsonReaderException:从JsonReader读取JArray时出错。当前JsonReader项不是数组:StartObject。路径'',行1,位置1。

错误发生在此行:

var objects = JArray.Parse(json);

我不明白如何修复这个问题?OVHjson不是已经是一个数组了吗?谢谢!

4
响应并不代表一个数组,因此无法通过JArray.Parse进行解析。 - Tomalak
2
准确地说,根据您发布的内容,JSON是一个对象,而不是数组。 - Evan Trimboli
1
请使用正确的方法 - 如果内容是一个对象,请使用JObject.Parse。更好的方法是,创建一个DTO(即具有所需属性的类),并一次反序列化整个对象,例如var myDTO = JsonConvert.DeserializeObject<MyDTO>(input); Console.WriteLine(myDTO.totalCredits); - Panagiotis Kanavos
看起来你的 API 方法在响应格式上不一致(有时返回数组,有时返回对象)。这是我在与一些合作伙伴合作时遇到的一种非常糟糕的设计。 - King King
我成功地接收到一个对象,谢谢。 - Swurderer
2个回答

6
不需要使用JArray.Parse,因为它不是一个数组...并且过于复杂...因此会出现错误。
所以只需使用以下语句:

var objects = JObject.Parse(json);

即可完成任务。
如果需要提取内容,可以使用以下方法:
totalCreditsRemoved = (String)objects.Value["totalCreditsRemoved"];
invalidReceivers = (String)objects.Value["invalidReceivers"];
ids = (String)objects.Value["ids"];
validReceivers = (String)objects.Value["validReceivers"];

1
 dynamic jsonObj = JsonConvert.DeserializeObject(responseFromServer);
 foreach (var obj in obj1.Properties())
 {
     if (obj.Name == "rewardConfirmation") {
         foreach (var obj2 in obj.Value)
         {
             MessageBox.Show(obj2.ToString());
         }
     }
 }

1
欢迎来到SO,请考虑通过编辑添加一些解释来完善您的答案。 - Saeed Zhiany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接