嘿,我需要一些帮助来循环以下 JSON 字符串:
{
"application_uid" : "3912d337-b797-4508-8c95-c76df8888ada",
"formId" : "F_Form1",
"recordCount" : 1,
"items" :
[
{
"lastModified" : "2015-12-11T20:07:25.774Z",
"lastModifiedBy" :
{
"displayName" : "Anonymous Guest User",
"email" : "",
"login" : "Anonymous Guest User"
},
"created" : "2015-12-11T20:07:25.774Z",
"createdBy" :
{
"displayName" : "Anonymous Guest User",
"email" : "",
"login" : "Anonymous Guest User"
},
"draft_ownerid" : "",
"flowState" : "ST_End",
"id" : 20,
"uid" : "5928bb18-5b53-43f9-8831-baab042e1ca2",
"F_ReceivedYorN" : "Y",
"F_ContractNumber" : "5556420121",
"F_FileNumber" : "0630250",
"F_SubscriberLastName" : "JEFFERY",
etc etc...
问题是名称可以更改F_ReceivedYorN,F_ContractNumber,F_FileNumber等。
我知道如何通过循环获取值,但只能通过定义对象的名称。无论 flowState、id 和 uid 值是什么,唯一将保持静态的名称。
即使我不知道它们将要叫什么,我如何遍历每个名称?
更新
假定的解决方案无济于事,因为它不像我上面的例子。重开
您的 JSON 由一个根对象组成,该根对象包含一个包含 "items"
属性,该属性具有具有标准和变量属性的对象数组。 您需要捕获每个项目中的所有属性名称和值,而无需事先知道它们。
你已经标记了你的问题 json.net 所以我将在 c# 中回答。 您有几个选择。
使用[JsonExtensionData]
Json.NET 支持通过将任意 JSON 属性反序列化和重新序列化到 POCO 中,方法是将[JsonExtensionData]
添加到自定义属性名称/值对的字典中:
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("");
}
}
原型小提琴。
使用ExpandoObject
Json.NET 直接支持反序列化为 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;
}
}
原型小提琴。
这消除了模型中对 Json.NET 的直接依赖。 但是,与第一个解决方案不同,ExpandoObject
是密封的,因此不能子类化以添加标准的三个属性。