从Shopify的graphql中获取结果,该结果不在标准结构中,可以简单地反序列化。
这是结果,但请注意item1
、item2
等的列表,它们可以是返回的1到100个项目,这是我不确定如何反序列化的部分,也是我的主要问题。具体来说,对于一个强类型的List<Item>
项集合,这样我就可以查询任何UserErrors
,即类似于:lstItems.Any(l => l.UserErrors.Any())
的内容。
第二个问题是data
并不总是有这些内容。。。其他GraphQL查询将具有不同的响应。也许在这种情况下,我应该将字符串中的data
重命名为具有这些内容的另一个类名,然后反序列化?
{
"data":{
"item1":{
"userErrors":[
]
},
"item2":{
"userErrors":[
]
}
},
"extensions":{
...
}
}
以下是QuickType的结果,但它再次假设Items
:的离散列表
namespace QuickType
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class InventoryUpdateResult
{
[JsonProperty("data")]
public Data Data { get; set; }
[JsonProperty("extensions")]
public Extensions Extensions { get; set; }
}
public partial class Data
{
[JsonProperty("item1")]
public Item Item1 { get; set; }
[JsonProperty("item2")]
public Item Item2 { get; set; }
}
public partial class Item
{
[JsonProperty("userErrors")]
public UserError[] UserErrors { get; set; }
}
public partial class UserError
{
[JsonProperty("field")]
public string[] Field { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}
public partial class Extensions
{
....
}
}
感谢@Charlieface为我指明了正确的方向。以下是我最终所做的。我试图弄清楚的另一个部分是如何将响应的data
部分与extensions
部分分离出来,这一部分结构正确,可以简单地反序列化为一个类,在写这个问题时我并不知道也不清楚。
- 因此,要拆分
data
部分,需要将字符串解析为JObject
- 然后按照建议将该部分反序列化为
Dictionary
- 然后,您可以迭代
Dictionary
以获得所有标准类对象,并对它们进行处理(将它们添加到自己的列表中,等等)
代码:
var jsonObject = JObject.Parse(response);
Dictionary<string, InventoryUpdateResult> dicRawResults;
var data = (JObject)jsonObject["data"];
if (data != null)
{
dicRawResults = JsonConvert.DeserializeObject<Dictionary<string, InventoryUpdateResult>>(data.ToString());
foreach(var result in dicRawResults)
{
InventoryUpdateResult inventoryUpdateResult = result.Value;
}
}
然后我提取了extensions
部分,并将其转换为类对象,如下所示:
jsonObject = JObject.Parse(shopifyResponse.Value);
var jExtension = (JObject)jsonObject["extensions"];
if (jExtension != null)
{
queryCost = jExtension.ToObject<GraphExtensions>();
.....
}