在 Web API 调用上将字符串 JSON 属性转换为对象

Posted

技术标签:

【中文标题】在 Web API 调用上将字符串 JSON 属性转换为对象【英文标题】:Convert string JSON property to Object on Web API Call 【发布时间】:2018-03-13 19:41:20 【问题描述】:

我有以下代表 MSSQL 数据库中的表的类:

public string firstname  get; set; 
public string lastname  get; set; 
public string events  get; set; 

'events' 属性实际上是一个 JSON 对象数组,在存储到表中之前已序列化。示例行:

FirstName: Test
LastName: User
Events: ["eventname":"event1","eventtype":"1","eventname":"event2","eventtype":"2"]

我需要从 Web API 调用中以 JSON 格式返回此表的内容,以类似于:

[
  "firstname":"Test",
  "lastname":"User",
  "Events":["eventname":"event1","eventtype":"1","eventname":"event2","eventtype":"2"]
,
...]

问题是当我这样做时,事件 JSON 属性被转义并以单个字符串的形式出现,如下所示:

[
  "firstname":"Test",
  "lastname":"User",
  "Events":"[\"eventname\":\"event1\",\"eventtype\":\"1\",\"eventname\":\"event2\",\"eventtype\":\"2\"]
,
...]"

显然这是因为 events 属性的类是一个字符串变量,但不确定我能做些什么而不必遍历每一行来重新格式化?

【问题讨论】:

【参考方案1】:

在 C# 中处理您的对象时,我建议创建一个 Event 类来创建 Event 对象列表:

public class Event

    public string EventName  get; set; 
    public string EventType  get; set; 


public class YourClass

    public string firstname  get; set; 
    public string lastname  get; set; 
    public List<Event> events  get; set; 

如果您需要将该对象作为 JSON 对象存储在您的 MSSQL 数据库中,您可以在将其保存到数据库时进行转换:

List<Event> yourEvents = new List<Event>();

Newtonsoft.Json.JsonConvert.SerializeObject(yourEvents).ToString();

当从您的 MSSQL 数据库中检索时,您可以使用 Serialize 函数的逆函数来创建您的 C# 列表:

Newtonsoft.Json.JsonConvert.DeserializeObject(yourRetrievedEvents);

Deserialize所有你可以使用Linq检索到的数据:

public class RetrievedClass

    public string firstname  get; set; 
    public string lastname  get; set; 
    public string events  get; set; 


List<RetrievedClass> dbData = mssql()

List<YourClass> result = dbData.Select(x => new YourClass
    
        firstname = x.firstname,
        lastname = x.lastname,
        events = Newtonsoft.Json.JsonConvert.DeserializeObject(x.events)
    );

不幸的是,我没有看到不使用 Linq 或循环的方法。

【讨论】:

这种方法很好,如果你想让模型同步,你可以有一个字符串属性 events,它将有一个 getter 序列化事件集合。这将使您轻松进行模型绑定和数据库同步 这实际上是我在 MSSQL 中创建数据所拥有的。之后反序列化意味着循环遍历每一行,不是吗? 啊,我明白了。我编辑了我的答案,包括我将如何反序列化数据。

以上是关于在 Web API 调用上将字符串 JSON 属性转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上将 Web 图像转换为 ListView

在 MVC Web Api 4 Beta 中从 Json 中删除 Null 属性

管理从 web api 以 json 格式返回的属性名称

System.Text.Json 反序列化来自 API 调用的嵌套对象 - 数据包装在父 JSON 属性中

ASP.NET MVC Web API 身份验证令牌安全问题

如何在火花上将json字符串转换为数据帧