有一些代码Json的DeserializeObject<T>(strJSONData)
从Web请求中获取数据并将其转换为类对象(我无法更改)(我可以改变类)。通过用[DataMember(Name = "raw_property_name")]
修饰我的类属性,我可以将原始JSON数据Map到我的类中的正确属性。有没有办法将JSON复杂对象的子属性Map到简单属性?这是一个例子:
{
"picture":
{
"id": 123456,
"data":
{
"type": "jpg",
"url": "http://www.someplace.com/mypicture.jpg"
}
}
}
除了URL,我不关心图片对象的其他任何部分,因此不想在C#类中设置复杂的对象。我只想设置如下内容:
[DataMember(Name = "picture.data.url")]
public string ProfilePicture { get; set; }
这可能吗?
7条答案
按热度按时间vecaoik11#
如果只需要一个额外的属性,一种简单的方法是将JSON解析为
JObject
,使用ToObject()
从JObject
填充类,然后使用SelectToken()
拉入额外的属性。假设你的类看起来像这样:
你可以这样做:
小提琴:https://dotnetfiddle.net/7gnJCK
如果你更喜欢一个更花哨的解决方案,你可以定制一个
JsonConverter
来使JsonProperty
属性像你描述的那样工作。转换器需要在类级别操作,并使用一些反射结合上面的技术来填充所有属性。下面是它的代码:为了进行演示,我们假设JSON现在如下所示:
......并且您对此人最喜欢的电影感兴趣(标题和年份)和最喜欢的颜色以及前面的信息。首先用
[JsonConverter]
属性标记目标类以将其与自定义转换器关联,然后在每个属性上使用[JsonProperty]
属性,指定所需的属性路径目标属性也不必是原语--您可以使用一个子类,就像我在这里对Movie
所做的那样(请注意,不需要插入Favorites
类)。在所有属性就绪后,您可以像平常一样进行反序列化,并且它应该"正常工作":
小提琴:https://dotnetfiddle.net/Ljw32O
pxq42qpu2#
标记的答案未100%完成,因为它忽略了可能注册的任何IContractResolver,如CamelCasePropertyNamesContractResolver等。
另外,为can convert返回false将防止其他用户案例,因此我将其更改为
return objectType.GetCustomAttributes(true).OfType<JsonPathConverter>().Any();
以下是更新后的版本:https://dotnetfiddle.net/F8C8U8
我还删除了在属性上设置
JsonProperty
的需要,如链接中所示。如果出于某种原因,上面的链接死亡或爆炸i还包括下面的代码:
pbgvytdp3#
而不是做
你必须做
否则我们有一个
无法确定类型的JSON对象类型...
例外
一段完整的代码如下所示:
dsf9zpds4#
如果有人需要使用@BrianRogers的JsonPathConverter和
WriteJson
选项,这里有一个解决方案(只适用于带点的路径):删除
CanWrite
属性,使其在默认情况下再次变为true
。将
WriteJson
代码替换为以下代码:正如我上面所说的,这只适用于包含点的路径,因此,您应该在
ReadJson
中添加以下代码以防止其他情况:kse8i1jr5#
另一个解决方案(原始源代码取自https://gist.github.com/lucd/cdd57a2602bd975ec0a6)。我清理了源代码并添加了类/类数组支持。需要C#7
样品型号
示例json:
添加JsonConverter后,可以像这样使用它:
小提琴:https://dotnetfiddle.net/pBK9dj
请记住,如果您在不同的类中有多个嵌套属性,则需要添加与您拥有的类一样多的转换器:
khbbv19g6#
顺便说一句,我添加了一些额外的东西来解释嵌套属性上的其他转换。例如,我们有一个嵌套的
DateTime?
属性,但是结果有时会以空字符串的形式提供,所以我们必须有 * 另一个 *JsonConverter
来适应这种情况。我们班是这样结束的:
JSON为:
上述
JsonConverter
的最终更新为:nue99wik7#
在此线程中所有答案的帮助下,我提出了
JsonPathConverter
类(用作JsonConverter
属性)的解决方案,该类实现了ReadJson
和WriteJson
,并使用正斜杠。类实现:
请记住,您还需要以下用法:
这个定制的
JsonConverter
的用法非常简单,假设我们有OP的JSON:据此,我们可以创建保存JSON数据的对象:
**注意:**不要忘记使用
JsonConverter
属性标记目标类,并如上所示指定新创建的JsonPathConverter
转换器。然后像往常一样将JSON反序列化为我们的对象: