您的 JSON 包含一个根对象,该对象包含一个 "items" 属性,该属性具有一组具有标准和可变属性的对象。您需要在事先不知道的情况下捕获每个项目中的所有属性名称和值。
您已将您的问题标记为json.net,因此我将在 c# 中回答。你有几个选择。
使用[JsonExtensionData]
Json.NET 通过将[JsonExtensionData] 添加到自定义属性名称/值对的字典中,支持将任意 JSON 属性反序列化和重新序列化到 POCO:
public class Item
{
public Item() { this.CustomFields = new Dictionary<string, JToken>(); }
public string flowState { get; set; }
public long id { get; set; }
public Guid uid { get; set; }
[JsonExtensionData]
public IDictionary<string, JToken> CustomFields { get; private set; }
}
public class RootObject
{
public RootObject() { this.items = new List<Item>(); }
public Guid application_uid { get; set; }
public string formId { get; set; }
public int recordCount { get; set; }
public List<Item> items { get; set; }
}
然后你可以循环遍历自定义属性的名称和值,如下所示:
var root = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var item in root.items)
{
Console.WriteLine(string.Format("Showing custom properties for Item id {0}, uid {1}, flowState {2}", item.id, item.uid, item.flowState));
{
foreach (var field in item.CustomFields)
{
Console.WriteLine(string.Format(" Field: \"{0}\": Value: \"{1}\"", field.Key, field.Value.ToString(Formatting.None)));
}
Console.WriteLine("");
}
}
原型fiddle。
使用ExpandoObject
Json.NET 直接支持deserializing to ExpandoObject,因此您可以将此类用于您的项目:
public class RootObject
{
public RootObject() { this.items = new List<ExpandoObject>(); }
public Guid application_uid { get; set; }
public string formId { get; set; }
public int recordCount { get; set; }
public List<ExpandoObject> items { get; set; }
}
然后做:
var root = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var item in root.items)
{
Console.WriteLine(string.Format("Showing custom properties for Item id {0}, uid {1}, flowState \"{2}\":",
item.AsDynamic().id, item.AsDynamic().uid, item.AsDynamic().flowState));
{
foreach (var field in item.AsDictionary())
{
if (field.Key == "id" || field.Key == "uid" || field.Key == "flowState")
continue;
Console.WriteLine(string.Format(" - Field: \"{0}\":\n Value: {1}", field.Key, JsonConvert.SerializeObject(field.Value)));
}
Console.WriteLine("");
}
}
使用以下扩展方法:
public static class DictionaryExtensions
{
public static IDictionary<TKey, TValue> AsDictionary<TKey, TValue>(this IDictionary<TKey, TValue> dictionary)
{
return dictionary;
}
}
public static class DynamicExtensions
{
public static dynamic AsDynamic(this IDynamicMetaObjectProvider obj)
{
return obj;
}
}
原型fiddle。
这消除了模型对 Json.NET 的直接依赖。但是,与第一个解决方案不同,ExpandoObject 是密封的,因此不能子类化以添加您的标准三个属性。