【问题标题】:.Net Core JsonElement parse multi-nested dynamic JSON [duplicate].Net Core JsonElement 解析多嵌套动态 JSON [重复]
【发布时间】:2021-05-29 02:19:19
【问题描述】:

我有来自前端的动态嵌套 JSON。请参阅下面的内容,与仅发送值不为空的那些键一样动态。在这些情况下,中间的首字母没有被填写,所以你找不到它:

{
    "name": {
        "firstname": "fst",
        "lastname": "lst"
    },
    "gender": "male",
    "birthdate": "2021-02-09",
    "maritalstatus": "Never married",
    "id": {
        "social": "123456789"
    }
}

我已经为每个潜在的属性尝试了这些:

JsonElement lastname;
question1.TryGetProperty("lastname", out lastname);

但是想找个更体面的方式,比如下面这个:

var options = new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true,
                IgnoreNullValues = true
            };

var jsonModel = JsonSerializer.Deserialize<Survey>(obj, options);
var modelJson = JsonSerializer.Serialize(jsonModel, options);

但问题是这种方式只能处理第一级属性,如性别、出生日期、婚姻状况,但对 firstname、lastname 和 social 无效。

如何解决它或我可以尝试的任何其他方法,非常感谢!

更新1:

Survey 是一个 poco,看起来像这样,但远不止这些属性,请参阅那些注释,我试图让自己做映射而不是我自己:

public class Survey
    {
        [JsonPropertyName("firstname")]
        public string FirstName{get;set;}

        [JsonPropertyName("middleinitial")]
        public char MiddleInitial{get;set;}

        [JsonPropertyName("lastname")]
        public string LastName{get;set;}

        [JsonPropertyName("jrsr")]
        public string JrSr{get;set;}


        [JsonPropertyName("gender")]
        public char Gender{get;set;}

        [JsonPropertyName("birthdate")]
        public DateTime Birthdate{get;set;}


        [JsonPropertyName("maritalstatus")]
        public string MaritalStatus{get;set;}


        [JsonPropertyName("Social")]
        public string SocialSecurityNumber{get;set;}

        public string MedicareNumber{get;set;}
        public string MedicaidNumber{get;set;}


    }

【问题讨论】:

  • Survey 的声明是什么样的?
  • @ConnorLow 谢谢,该解决方案有效,所以实际上是一个自定义的 json 转换器和加上反射,它在转换器内部采用注释“name.firstname”,它有 SelectToken 方法处理它.

标签: c# asp.net json asp.net-core


【解决方案1】:

试试这个:

 dynamic model = JsonConvert.DeserializeObject(jsonStr);

并访问您想要的任何内容:

var firstName = model.name.firstname;

更新 1: 您应该为复杂的字段定义不同的模型。

    public class Survey
    {

        public NameModel Name { get; set; }

        public IdModel Id { get; set; }

        public char MiddleInitial { get; set; }
        public string JrSr { get; set; }
        public string Gender { get; set; }
        public DateTime Birthdate { get; set; }
        public string MaritalStatus { get; set; }
        public string MedicareNumber { get; set; }
        public string MedicaidNumber { get; set; }
    }

    public class NameModel
    {
        public string LastName { get; set; }

        public string FirstName { get; set; }
    }

    public class IdModel
    {
        public string Social { get; set; }
    }

另外,当模型和 JSON 中的字段名称相同时,无需使用 JsonPropertyName

【讨论】:

  • 谢谢,这个比 try 方法好,但仍然需要我自己迭代每个属性。我们能不能让自己做映射?
  • @Alex 在处理 JSON 时,我们要么知道它的属性并定义一个模型来反序列化,要么 JSON 动态变化。当您更新答案时,您应该为 nameid 等复杂属性定义不同的模型,我更新了我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2021-10-18
相关资源
最近更新 更多