【问题标题】:Deserializing Json: Custom Fields with Numeric Identifiers反序列化 Json:带有数字标识符的自定义字段
【发布时间】:2018-10-01 05:42:53
【问题描述】:

我正在与一家拥有 Restful API 基础架构的供应商合作,该基础架构允许在某些实体上使用“自定义字段”。当您通过其界面在其中一个实体上创建自定义字段时,您为自定义实体命名。但是,在他们的 API 中,您尝试使用该自定义字段,它实际上是由一个 int 指定的(它表示该字段的唯一 ID)。例如,您在实体上创建的第一个自定义字段的 ID 为 1,这就是您从 API 访问或读取该字段的方式。

因此,在下面的 Json 响应示例中,您将看到用于注册的自定义字段在“注册字段”集合中返回。 4 是自定义字段的 ID,ABC123 是该自定义字段中填充的值。

"enrollment_fields":{  
               "4":"ABC123"
            },

我不太确定如何在我的项目类中处理这个问题。显然我不能给对象成员一个数字作为名称。我将如何将这种类型的成员反序列化到我的对象中,以便我可以读取值 ABC123?

【问题讨论】:

  • 这里有类似的问题:stackoverflow.com/questions/43351824/…
  • 你可以试试 Dynamic / Expando 对象。虽然没有尝试使用整数作为属性名称,但他们可能会处理它。
  • enrollment_fields 我会用EnrollementField { int Id; string Value;} 创建一个obj List<EnrollementField> enrollment_fields。并将这部分 Json 反序列化为 Dictionary<string,string>。用 foreach 循环它,我将初始化 List<EnrollementField>。

标签: c# json rest


【解决方案1】:

由于 C# 中的 Object 不能将属性作为数字,所以有两种方法可以做

如果您的密钥不会改变:

[JsonProperty(PropertyName = "4")]
public String Four { get; set; }

否则,您可以使用Dictionary<string, string>。

【讨论】:

    【解决方案2】:

    在这里,我创建了一个示例控制台应用程序用于您的演示。

    class Program
    {
        static void Main(string[] args)
        {
            //This is your sample json that comes from Rest API
            string json = @"
                            {'enrollment_fields':{  
                                                 '4':'ABC123',
                                                 '5': 'XYZ123',
                                                 '6': 'PQR123'
                                                 }
                            }";
    
    
            //Deserialize your json into Dictionary of dictionary.
            var obj = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(json);
    
            //Get your desired key from outer dictionary
            var enrollment_fields = obj["enrollment_fields"];
    
            //Loop on inner dictionary key to get values
            foreach (string key in enrollment_fields.Keys)
                //Here you get your dynamic key. e.g. 4,5,6
                Console.WriteLine(key + ": " + enrollment_fields[key]);
    
            Console.ReadLine();
        }
    }
    

    注意:从Nuget Package Manager 下载Newtonsoft.json 并在您的程序中使用using Newtonsoft.Json; 之类的命名空间。

    输出:

    【讨论】:

    • @Ry.the.Stunner,查看答案可能对你有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多