无法在 C# 中读取 Json 对象

Posted

技术标签:

【中文标题】无法在 C# 中读取 Json 对象【英文标题】:Not able to read Json Object in c# 【发布时间】:2019-12-14 13:11:26 【问题描述】:

我正在尝试解析 JSON 对象,如下所示,其中标头对象将是一个随机的字母数字。此外,有时 JSON 可能只包含一个对象。


  "48ce0e9a-ee27-4e7b-93a5-4f219974f62c": 
    "preview": 
      "FRONT": "https://123avb.jpg",
      "INSIDE_TOP": "https://456ihn.jpg",
      "INSIDE_BOTTOM": "https://987ung.jpg",
      "BACK": "https://ikh980.jpg"
    ,
    "print": 
      "primary": "https://iifuer.pdf",
      "secondary": "https://09e491.pdf"
    
  ,
  "d767e1a6-7afe-4d17-85f7-d512a0ca0b14": 
    "preview": 
      "FRONT": "https://0ff7cc7.jpg",
      "BACK": "https://64e7a8.jpg"
    ,
    "print": 
      "primary": "https://73fbdc.pdf"
    
  

我为这些对象创建了类:

namespace FulfillmentModel

    public class Baseclass
    
        public G1 G1  get; set; 

        public Env Env1  get; set; 
    

    public class Preview
    
        [JsonProperty("FRONT")]
        public string FRONT  get; set; 

        [JsonProperty("INSIDE_TOP")]
        public string INSIDE_TOP  get; set; 

        [JsonProperty("INSIDE_BOTTOM")]
        public string INSIDE_BOTTOM  get; set; 

        [JsonProperty("BACK")]
        public string BACK  get; set; 
    

    public class Print
    
        [JsonProperty("primary")]
        public string primary  get; set; 
        [JsonProperty("secondary")]
        public string secondary  get; set; 
    

    public class G1
    
        public Preview preview  get; set; 
        public Print print  get; set; 
    

    public class Preview2
    
        public string FRONT  get; set; 
        public string BACK  get; set; 
    

    public class Print2
    
        public string primary  get; set; 
    

    public class Env
    
        public Preview2 preview  get; set; 
        public Print2 print  get; set; 
    

我正在从 API 读取 JSON 对象。 我正在使用以下代码将其转换为BaseClass

string Jsontring= response.Content.ReadAsStringAsync().Result;
var verificationResult = JsonConvert.DeserializeObject<Baseclass>(Jsontring);

BaseClass 中的对象为空。

我不确定我做错了什么。你能帮忙吗?

【问题讨论】:

【参考方案1】:

在您的 JSON 中,最外面的对象中有键 48ce0e9a-ee27-4e7b-93a5-4f219974f62cd767e1a6-7afe-4d17-85f7-d512a0ca0b14。但是这些键不存在于您要反序列化到的 Baseclass 模型类中,其中包含 G1Env 属性。您可以使用[JsonProperty] 属性标记这些属性,但由于您说这些键是随机的,处理它的更好方法是反序列化为Dictionary&lt;string, G1&gt;。 (如果您确定字母数字键始终代表 GUID,您也可以使用 Dictionary&lt;Guid, G1&gt;)。

var verificationResult = JsonConvert.DeserializeObject<Dictionary<string, G1>>(Jsontring);

现在verificationResult 将包含一个字典,其中的键是来自 JSON 的随机键。每个键对应的值将是一个G1 对象,其中填充了PreviewPrint 对象。

这里是演示小提琴:https://dotnetfiddle.net/kzGihd

【讨论】:

Dictionary&lt;Guid, G1&gt; 会更好。 @PMExtra 也许。 OP没有说钥匙是Guids(尽管它们看起来确实是);只是它们是“随机字母数字”。鉴于宽松的 goosey 规范,字符串键更安全。【参考方案2】:

您是否尝试在异步函数之前添加等待?

等待响应.Content.ReadAsStringAsync()

【讨论】:

以上是关于无法在 C# 中读取 Json 对象的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法从 API 调用读取 json 响应

我想在c#中使用foreach循环一一读取具有特定json对象数组的json文件数据

使用 C# 到 JavaScript 的 UWP WebView 中 JSON 的问题无法正确读取

C# 无法读取和解释 Web API/JSON

C#读取Excel中嵌套的Json对象,Json带斜杠的问题(其一)

如何使用 JSON Utility 读取键中带有连字符的对象?