【问题标题】:How to parse JSON using RestSharp?如何使用 RestSharp 解析 JSON?
【发布时间】:2012-08-03 21:23:17
【问题描述】:
var client = new RestClient("http://10.0.2.2:50670/api");

var request = new RestRequest("Inventory", Method.GET);

request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

// execute the request to return a list of InventoryItem
RestResponse<JavaList<InventoryItem>> response = (RestResponse<JavaList<InventoryItem>>)client.Execute<JavaList<InventoryItem>>(request);

返回的内容是一个 JSON 字符串,一个对象数组。以下是它的简短摘录:

[{"Id":1,"Upc":"1234567890","Quantity":100,"Created":"2012-01-01T00:00:00","Category":"Tequila","TransactionType":"Audit","MetaData":"PATRON 750ML"},{"Id":2,"Upc":"2345678901","Quantity":110,"Created":"2012-01-01T00:00:00","Category":"Whiskey","TransactionType":"Audit","MetaData":"JACK DANIELS 750ML"},{"Id":3,"Upc":"3456789012","Quantity":150,"Created":"2012-01-01T00:00:00","Category":"Vodka","TransactionType":"Audit","MetaData":"ABSOLUT 750ml"}]

错误信息:

由于对象的当前状态,操作无效

这里有什么问题?我的 InventoryItem 与 JSON 字符串中的每个对象具有相同的属性。我错过了一步吗?

【问题讨论】:

  • 您使用 JavaList 有什么特别的原因吗?您也可以发布 InventoryItem 的代码吗?

标签: c# xamarin.android restsharp


【解决方案1】:

我怀疑在 RestSharp 中使用的 SimpleJson 无法反序列化为 JavaList。

首先我会尝试反序列化为:

List<InventoryItem>

如果做不到这一点,我推荐ServiceStack.Text - .Net 最快的 JSON 库;并做:

var response = client.Execute(request);
var thingYouWant = JsonSerializer.DeserializeFromString<List<InventoryItem>>(response.Content);

这实际上是我自己做的。

编辑(感谢评论员): 在较新的版本中,现在是:

var deserializer = new JsonDeserializer();
deserializer.Deserialize<List<InventoryItem>>(response);

【讨论】:

  • 我的 JsonSerializer 没有名为 DeserializeFromString 的方法。我确实找到了带有 JsonDeserializer 类的 Deserialize。自去年以来,他们可能在更新中对其进行了更改。
  • JsonDeserializer deserializer = new JsonDeserializer(); deserializer.Deserialize&lt;List&lt;InventoryItem&gt;&gt;(response);
  • 我用反映较新版本的语法编辑了我的帖子。删除反对票怎么样?
【解决方案2】:

自动魔法施法失败,我在紧要关头使用它:

var rc = new RestClient("https://api-ssl.bitly.com");
var rr = new RestRequest("/v3/link/clicks?access_token={access_token}&link={bitlyUrl}", Method.GET);

rr.AddUrlSegment("bitlyUrl", bitlyUrl);
rr.AddUrlSegment("access_token", BityAccessToken);

var response = rc.Execute(rr);
dynamic json = Newtonsoft.Json.Linq.JObject.Parse(response.Content);
var clicks = Convert.ToInt32(json.data.link_clicks.Value);

【讨论】:

  • 不会再工作了; .data 返回为 null,它现在必须以不同的方式处理它。但是,您可以遍历 json 子项,如果名称(键)与您指定的名称(键)匹配,则以这种方式获取 .value。可能不是最好的解决方案,但可以在紧要关头让它发挥作用。
猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2015-11-08
  • 2020-09-14
  • 2021-09-05
相关资源
最近更新 更多