Deserializing JSON with unknown object names(使用未知对象名称反序列化 JSON)
问题描述
我正在尝试反序列化来自 API 的 JSON 响应.JSON 如下所示(MAC 地址和位置已更改):
I'm trying to deserialize a JSON response from an API. The JSON looks like this (MAC addresses and location are altered):
{
"body" : [{
        "_id" : "da:87:54:26:53:97",
        "place" : {
            "location" : [-23.334961, 47.398349],
            "altitude" : 30,
            "timezone" : "Europe/London"
        },
        "mark" : 3,
        "measures" : {
            "f2:bf:a7:6f:e7:e8" : {
                "res" : {
                    "1469997248" : [20.4, 66]
                },
                "type" : ["temperature", "humidity"]
            },
            "42:b7:48:59:7c:4b" : {
                "res" : {
                    "1469997263" : [1016.7]
                },
                "type" : ["pressure"]
            }
        },
        "modules" : ["f2:bf:a7:6f:e7:e8"]
    }
],
"status" : "ok",
"time_exec" : 0.034152030944824,
"time_server" : 1469997417
}
问题在于措施块.由于对象的名称正在更改,我不知道如何将其正确反序列化为 C# 对象.我在这里发现了一个与使用字典的解决方案类似的问题,但是如果我这样尝试,我只会得到 null目录.
The problem is the measures block. Since the name of the object is changing, I don't know how to deserialize it properly into a C# object. I found a similiar problem on here with the solution to use a dictonary, however if I try it this way I just get null directory.
这是我的反序列化方法:
This is my deserialize method:
APIResponse apiResponse = JsonConvert.DeserializeObject<APIResponse>(await content.ReadAsStringAsync());
这是 APIResponse 类:
And this is the APIResponse class:
public class APIResponse
{
    public Body[] body { get; set; }
    public string status { get; set; }
    public float time_exec { get; set; }
    public int time_server { get; set; }
}
public class Body
{
    public string _id { get; set; }
    public Place place { get; set; }
    public int mark { get; set; }
    public Measures measures { get; set; }
    public string[] modules { get; set; }
}
public class Place
{
    public float[] location { get; set; }
    public float altitude { get; set; }
    public string timezone { get; set; }
}
public class Measures
{
   public Dictionary<string, SingleModule> singlemodules{ get; set; }
}
public class SingleModule
{
    public Res res { get; set; }
    public string[] type { get; set; }
}
public class Res
{
    public MeasuredData measuredData { get; set; }
}
public class MeasuredData
{
    public float[] values { get; set; }
}
有什么方法可以轻松地正确反序列化这些措施?
Any way to properly derserialize the measures easily?
推荐答案
看起来你应该能够摆脱你的 Measures 类.相反,将字典直接放入您的 Body 类:
It looks like you should be able to just get rid of your Measures class. Instead, put the dictionary straight into your Body class:
public class Body
{
    public string _id { get; set; }
    public Place place { get; set; }
    public int mark { get; set; }
    public Dictionary<string, SingleModule> measures { get; set; }
    public string[] modules { get; set; }
}
另外,我强烈建议您的属性遵循 .NET 命名约定,并使用 [JsonProperty("measures")] 等向 Json.NET 指示如何翻译您的属性属性转换成 JSON.
As a separate matter, I'd strongly recommend following .NET naming conventions for your properties, and using [JsonProperty("measures")] etc to indicate to Json.NET how to translate your properties into JSON.
这篇关于使用未知对象名称反序列化 JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用未知对象名称反序列化 JSON
				
        
 
            
        - 使用 rss + c# 2022-01-01
 - 为什么 C# 中的堆栈大小正好是 1 MB? 2022-01-01
 - 是否可以在 .Net 3.5 中进行通用控件? 2022-01-01
 - C# 通过连接字符串检索正确的 DbConnection 对象 2022-01-01
 - CanBeNull和ReSharper-将其用于异步任务? 2022-01-01
 - Azure Active Directory 与 MVC,客户端和资源标识同一 2022-01-01
 - 在 C# 中异步处理项目队列 2022-01-01
 - 带问号的 nvarchar 列结果 2022-01-01
 - 在 LINQ to SQL 中使用 contains() 2022-01-01
 - Windows 喜欢在 LINUX 中使用 MONO 进行服务开发? 2022-01-01
 
						
						
						
						
						