【问题标题】:How to Deserialize Json Newtonsoft [duplicate]如何反序列化 Json Newtonsoft [重复]
【发布时间】:2021-11-27 08:15:07
【问题描述】:

我之前从服务器获得了这个 JSON 字符串

"[
 {
    \"name":\"XYZ",
    \"age\":\"75\",
    \"height\":\"170.1\",
    \"weight\":\"69.6\",
    \"dob\":\"2000-10-07T07:23:26.876Z\"
 },
 {
    \"name":\"ABC",
    \"age\":\"15\",
    \"height\":\"160.1\",
    \"weight\":\"55.6\",
    \"dob\":\"1990-10-07T07:23:26.876Z\"
 },
]"

为此我使用了这样的类

   public class Person
   {
      [JsonProperty("name")]
      public string Name {get; set;}
      [JsonProperty("age")]
      public decimal Age {get; set;}
      [JsonProperty("height")]
      public decimal Height {get; set;}
      [JsonProperty("weight")]
      public decimal Weight {get; set;}
      [JsonProperty("dob")]
      public DateTime DOB {get; set;}   
   }

我已经反序列化了它使用

    JsonConvert.DeserializeObject<Person[]>(jsonString)

但是现在服务器把JSON改成这样了

"{
    \"XYZ":
    {
        \"age\":\"75\",
        \"height\":\"170.1\",
        \"weight\":\"69.6\",
        \"DOB\":\"2000-10-07T07:23:26.876Z\"
    },
    \"ABC":
    {
        \"age\":\"15\",
        \"height\":\"160.1\",
        \"weight\":\"55.6\",
        \"DOB\":\"1990-10-07T07:23:26.876Z\"
    }
}"

name 属性被移除,取而代之的是根元素。我尝试将课程更改为这样,但它不起作用。如何反序列化它?

    public class PersonResult
    {
        public Person [] Persons {get; set;}
    }

【问题讨论】:

  • 如果你有来自服务器的那个字符串,它看起来是双重编码的。如果您在从服务器获取文本后将该文本从调试器中拉出,请注意不要尝试删除实际上不存在的反斜杠,它们是由调试器显示工具提示插入的 VS
  • 你说得对,我从调试器中复制了字符串。

标签: c# json


【解决方案1】:
string jsonString = @"{
    ""XYZ"":
    {
        ""age"":""75"",
        ""height"":""170.1"",
        ""weight"":""69.6"",
        ""DOB"":""2000-10-07T07:23:26.876Z""
    },
    ""ABC"":
    {
        ""age"":""15"",
        ""height"":""160.1"",
        ""weight"":""55.6"",
        ""DOB"":""1990-10-07T07:23:26.876Z""
    }
}";

// deserialize
var data = JsonConvert.DeserializeObject<Dictionary<string, Person>>(jsonString);
// fixup
foreach (var (key, value) in data)
{
    value.Name = key;
}
// display
foreach (var (key, value) in data)
{
    Console.WriteLine($"{value.Name}, {value.Age}");
}

【讨论】:

  • 也可以使用字典上的.Select(..)直接映射到之前的Person[]
  • 这非常有效。我想知道是否有任何其他方法可以做到这一点并避免对当前代码进行大量更改。
  • 向我们展示您需要对当前代码进行哪些更改。也许我们可以将其变成一种扩展方法,您可以在任何您发现不稳定 json 的地方使用它
  • Marc 的回答旨在向您展示如何应对 JSON 更改,但您需要以对您的应用有意义的方式集成它。您不必将任何内容更改为字典。. 如果您现在有一个类似于 public Person[] TurnApiResponseIntoPaersonArray(string json) 的方法,那么您不必将其更改为 public Dictionary&lt;...&gt; TurnApiResponseIntoPersonDictionary(string json) 并将更改波及树,您只需方法返回例如data.Values.ToArray() 在对它执行 Marc 的修复之后。字典永远不会离开方法
  • ..这只是帮助您重塑数据的临时步骤。如果您想从字典中取出一个数组,请再次转换。这就是我之前提到的关于告诉我们更多关于它在多少个不同的地方使用的内容。如果有很多,那么过程将始终相同:您将需要 Dictionary&lt;string, X&gt; 然后您将复制字典条目的Key 进入X 的属性Y。这就是过程,它可以用通用的方式来描述;这段代码可以编写一次并适用于任何你遇到 JSON 从数组到字典的问题
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 2019-12-20
相关资源
最近更新 更多