当前位置: 首页 > 面试题库 >

使用未知对象名称反序列化JSON

雍志文
2023-03-14
问题内容

我正在尝试反序列化来自API的JSON响应。JSON如下所示(MAC地址和位置已更改):

{
"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#对象。我在这里发现使用字典的解决方案存在类似问题,但是如果以这种方式尝试,我只会得到空目录。

这是我的反序列化方法:

APIResponse apiResponse = JsonConvert.DeserializeObject<APIResponse>(await content.ReadAsStringAsync());

这是APIResponse类:

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; }
}

有什么方法可以轻松地适当地反序列化这些措施吗?


问题答案:

看来您应该可以摆脱Measures课堂教学。而是直接将字典放入您的Body班级:

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")]etc指示Json.NET如何将属性转换为JSON。



 类似资料:
  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法

  • json如下所示: 我读了20多个答案,但找不到如何反序列化这样一个结构,请帮助我了解这个课程是什么样的,因为小时不是一个固定的字符串。

  • 问题内容: 我正在使用JSON.NET对对象进行序列化以连接到REST API。我对象中需要序列化为JSON的属性之一具有动态属性名称。如果此属性的struct中包含的值是数字值,则JSON属性为“ type_id”,但是,如果此值是字符串值,则JSON属性名称为“ type_code”。我尝试为此使用自定义,但是在尝试序列化时收到以下消息: “状态为Property的令牌PropertyName

  • 问题内容: 在C#中,我已经通过使用如下代码成功将匿名对象序列化为JSON … 但是,我以后想要做的是将JSON字符串反序列化为一个匿名对象。像这样 但是serializer.Deserialize()方法需要第二个参数,该参数是将反序列化到的对象的类型。 我试过了 但这会产生错误: 没有为’<> f__AnonymousType0`2 [[System.Int32,mscorlib,Versio