【问题标题】:Deserialize json string with multiple objects反序列化具有多个对象的 json 字符串
【发布时间】:2021-02-24 15:19:30
【问题描述】:

调用 API 后我得到以下 JSON 响应:

{
   "Item": "Some value",
   "Status": "ST",
   "Details": "something here...",
   "TargetObject": [
      {
         "Value1": "1",
         "Value2": [
            {
               "ABC1": "......",
               "ABC2": "...",
               "ABC3": "..."
            }
         ],
         "Value3": [
            {
               "ABCD1": "......",
               "ABCD2": "...",
               "ABCD3": [
                  {
                     "ABCVal": "123"
                  },
                  {
                     "Extra": "123"
                  }
               ]
            }
         ]
      }
   ]
}

我想要做的是从 TargetObject 返回值但是这个键里面有多个对象/数组所以我的问题是:我怎样才能只返回这些值并打印以下 JSON结果:

{
   "TargetObject": [
      { 
        "Value1": "1",
        "Value2": [
           {
              "ABC1": "......",
              "ABC2": "...",
              "ABC3": "..."
           }
        ],
        "Value3": [
           {
              "ABCD1": "......",
              "ABCD2": "...",
              "ABCD3": [
                 {
                    "ABCVal": "123"
                 },
                 {
                    "Extra": "123"
                 }
              ]
           }
        ]
     }
   ]
}

这是我尝试过的:

public async Task<List<List<MyModel>>> GetAsync(string url)
{
    /*
        Code to get the above JSON
    */
    
    //Trying to return the expected JSON
    return JsonConvert.DeserializeObject<List<List<MyModel>>>(jsonString);
}

这是我的模型:

public class MyModel
{
    public string TargetObject { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
    public string ABC1 { get; set; }
    public string ABC2 { get; set; }
    public string ABC3 { get; set; }
    public string Value3 { get; set; }
    public string ABCD1 { get; set; }
    public string ABCD2 { get; set; }
    public string ABCD3 { get; set; }
    public string ABCVal { get; set; }
    public string Extra { get; set; }
}

目前我收到以下错误:

Newtonsoft.Json.JsonSerializationException:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[myProjectNamespace.Models.MyModel]”,因为类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。

【问题讨论】:

  • 使用json to C#quicktype 之类的东西来构建你的类定义来支持你的json。您还会注意到为什么会出现该异常。
  • 你的 json 有多“动态”,因为支持 Dictionary&lt;string,string&gt; 来支持 Value2 之类的东西是一回事,但要支持任何键/值有点困难

标签: c# json asp.net-core


【解决方案1】:

动态对象呢?

     public async Task<dynamic> GetAsync(string url)
     {
      /*
          Code to get the above JSON
      */     
      return Newtonsoft.Json.JsonConvert.DeserializeObject(res);
     }

PS:安装 Newtonsoft.Json

【讨论】:

  • 这解决了错误消息,但打印的 JSON 是空白的,只有字符 { [ 但为空值
  • 只要调用一个属性就会显示一些东西。
【解决方案2】:

如果您有强类型 JSON,那么您需要创建一些模型 (DTO) 来表示 JSON 的结构。注意:ABCD3Value2Value3中有不同的类型,请根据您的数据自行定义

public class Root
{
    public List<TargetObject> TargetObject { get; set; } 
}
public class TargetObject
{
    public string Value1 { get; set; } 
    public List<Value2> Value2 { get; set; } 
    public List<Value3> Value3 { get; set; } 
}
public class Value2
{
    public string ABC1 { get; set; } 
    public string ABC2 { get; set; } 
    public string ABC3 { get; set; } 
}
public class Value3
{
    public string ABCD1 { get; set; } 
    public string ABCD2 { get; set; } 
    public List<ABCD3> ABCD3 { get; set; } 
}
public class ABCD3
{
    public string ABCVal { get; set; } 
    public string Extra { get; set; } 
}

然后

 return JsonConvert.DeserializeObject<Root>(jsonString);

如果您只需要将TargetObject 的内容作为string 获取,请使用:

var jsonDoc = JsonDocument.Parse(jsonString);
var targetObject = jsonDoc.RootElement.GetProperty("TargetObject").GetRawText();

【讨论】:

  • 我正在尝试第二种解决方案,但收到以下错误消息:请求的操作需要“对象”类型的元素,但目标元素的类型为“数组”
  • 您能详细解释一下您需要什么吗?它应该是一个类型化的对象,还是可以将它作为一个字符串来获取?它会让我指导如何编辑我的答案
  • 你在第一个答案中所做的没关系,我只是看看第二个答案是否也适合我。错误信息已解决。响应在 JSON 的开头和结尾添加 [ ]。
  • 好的,如果您需要实现第一种情况,请注意我在答案中的注释中描述的类型。
猜你喜欢
  • 2020-06-07
  • 2019-05-30
  • 2021-02-11
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多