Json不知道结构



嘿,我需要一些帮助来循环以下 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等。

我知道如何通过循环获取值,但只能通过定义对象的名称。无论 flowStateiduid 值是什么,唯一将保持静态的名称。

即使我不知道它们将要叫什么,我如何遍历每个名称?

更新

假定的解决方案无济于事,因为它不像我上面的例子。重开

您的 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是密封的,因此不能子类化以添加标准的三个属性。

相关内容

最新更新