【问题标题】:How to copy JObject into strongly-typed object?如何将 JObject 复制到强类型对象中?
【发布时间】:2015-05-07 14:34:44
【问题描述】:

为简单起见,我制作了非常简单的结构。

传入的 JSON:

jsonInput = "{ 'FNAME': 'John'; 'LNAME': 'Doe', 'CITY': 'Vancuver'}";

我需要与 Person 类的强类型对象集成:

class Person
{
    public string FNAME { get; set; }
    public string LNAME { get; set; }
    public string CITY { get; set; }
    public string COUNTRY { get; set; }
}

Person 对象首先被创建 (在现实生活中来自 DB,但在这里我将对其进行硬编码):

var person = new Person { CITY = 'Toronto', COUNTRY = 'Canada'};

如何将 jsonInput 整合(合并)到 person 以拥有完整的 Person 对象。 JSON 数据应该仅针对匹配的属性覆盖 Person 对象

所以,我首先将 JSON jsonInput 反序列化为动态对象

var obj = JsonConvert.DeserializeObject(jsonInput);

所以,现在我已经部分填充了 obj 对象(类型为 JObject)和部分填充了 person 对象(类型为 )。

如何,在一个命令中我可以将它们合并到 person 对象中。 或者也许还有另一种方法可以将 jsonInput 直接反序列化为 person ??

结果应该是:

person.FNAME = 'John'
person.LNAME = 'Doe'
person.CITY = 'Vancuver'
person.COUNTRY = 'CANADA'

我要避免的是循环遍历属性。 感谢您的任何建议。

【问题讨论】:

  • 您是否尝试过使用JsonConvert.PopulateObject(jsonInput, person)? (顺便说一句,我强烈建议您使用更传统的属性名称。您可以使用属性来表达它们如何映射到 JSON。)
  • 乔恩,是的,我知道,这不是我对属性名称的决定 :-)

标签: c# dynamic json.net


【解决方案1】:

使用PopulateObject方法

JsonConvert.PopulateObject(jsonInput,person);

【讨论】:

    【解决方案2】:

    假设您将 json 作为参数接收...

    jsonInput = "{ 
                  'PERSON' : {
                             'FNAME': 'John'; 
                             'LNAME': 'Doe', 
                             'CITY': 'Vancuver'
                            } 
                 }";
    Public class Person{
         public Person(string json,string city,string country){
                JObject jObject = JObject.Parse(json);
                JToken jPerson = jObject["PERSON"];
                FNAME= (string) jPerson ["FNAME"];
                LNAME= (string) jPerson ["LNAME"];
    
                COUNTRY = country:
                CITY= ((string) jPerson ["CITY"] == string.Empty)?city:(string) jPerson ["CITY"]; //IF CITY PROPERTY EMPTY USE CITY ELSE USE JSON PROPERTY
    
             }  
               public string FNAME{ get; set; }
               public string LNAME{ get; set; }
               public string CITY{ get; set; }
               public string COUNTRY{ get; set; }         
    }
    

    未测试,但希望有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2014-03-26
      • 2018-11-12
      • 1970-01-01
      • 2015-12-03
      相关资源
      最近更新 更多