【问题标题】:How can I parse instance properties by using json data?如何使用 json 数据解析实例属性?
【发布时间】:2018-03-14 06:31:21
【问题描述】:

我尝试将 json 数据解析为 List<Employee> 实例。但我不想使用 Json-to-C# 工具从 json 模式创建阴影。我只想取值。也许我可以使用键来获取值(员工)。我想填写一份员工名单。

我的 Json:

{
   "type":"SUCCESS",
   "msg":"Container RBFFiyatlama2_1.0.1 successfully called.",
   "result":{
      "execution-results":{
         "results":[
            {
               "value":2,
               "key":""
            },
            {
               "value":{
                  "com.myteam.rbffiyatlama2.Employee":{
                     "salary":2400.0,
                     "age":35,
                     "cofactor":0.2
                  }
               },
               "key":"Employee0"
            },
            {
               "value":{
                  "com.myteam.rbffiyatlama2.Employee":{
                     "salary":4800.0,
                     "age":35,
                     "cofactor":0.2
                  }
               },
               "key":"Employee1"
            }
         ],
         "facts":[
            {
               "value":{
                  "org.drools.core.common.DefaultFactHandle":{
                     "external-form":"0:88:1504512052:1504512052:160:DEFAULT:NON_TRAIT:com.myteam.rbffiyatlama2.Employee"
                  }
               },
               "key":"Employee0"
            },
            {
               "value":{
                  "org.drools.core.common.DefaultFactHandle":{
                     "external-form":"0:89:213603577:213603577:159:DEFAULT:NON_TRAIT:com.myteam.rbffiyatlama2.Employee"
                  }
               },
               "key":"Employee1"
            }
         ]
      }
   }
}

如何在不创建任何 C# 类的情况下使用上述 json 填充 Employee。

public class Employee
{
    public int age { get; set; }
    public double cofactor { get; set; }
    public int salary { get; set; }
}

【问题讨论】:

  • 您是否愿意使用库来执行此操作,或者您更喜欢原生 .NET?
  • @IainFraser native .NET 意味着 Json.NET 几年了。甚至 ASP.NET MVC Web API 也使用它
  • TBH,当我问这个问题时,我并没有完全理解这个问题。我认为他/她想在运行时动态创建一个类,而不是使用任何库来完成。

标签: c# .net json rest json.net


【解决方案1】:

您可以使用动态。以下应该做你所追求的,而且都是原生的:

string jsonString = YourGetJsonStringMethod();
List<Employee> employees = new List<Employee>();
dynamic data = System.Web.Helpers.Json.Decode(jsonString);
dynamic results = data["result"]["execution-results"]["results"];
if (results.Length > 1)
{
    for (var i = 1; i < results.Length; i++)
    {
        var dynamicEmployee = results[i]["value"]["com.myteam.rbffiyatlama2.Employee"];
        dynamicEmployee["salary"] = (int) dynamicEmployee["salary"];
        var encoded = System.Web.Helpers.Json.Encode(dynamicEmployee);
        employees.Add(System.Web.Helpers.Json.Decode<Employee>(encoded));
    }
}

您显然需要在您的引用中包含 System.Web.Helpers,您可以在 Visual Studio 引用管理器中的“程序集”>“扩展”下找到它。

请记住,此代码可能会在您调试时引发异常。如果有,请参考this question 解决方案。

此代码“正常工作”。我会留给你做验证、空值检查和异常捕获。

【讨论】:

  • 说实话,重新编码然后解码每个结果有点浪费,但我想给你一个完全不干涉的方法。最好只从dynamic 中获取值并手动填充一个新的Employee
  • 正如其他人所指出的,您也可以使用 Json.NET 而不是 System.Web.Helpers。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2019-01-11
  • 1970-01-01
相关资源
最近更新 更多