【问题标题】:C# Parsing a IHttpActionResult Json Object returned by a method callC# 解析方法调用返回的 IHttpActionResult Json 对象
【发布时间】:2019-05-05 18:15:41
【问题描述】:

我从另一个方法中的方法调用返回一个 Json 对象,想问一下如何访问在返回的 Json 对象中创建的属性?

我知道我可以返回一个具有所需属性的非 Json 对象,但是我将如何访问传递给返回的 Json 的匿名类型

    [HttpPost]
    public IHttpActionResult PhoneReminder([FromUri] RegisterInterest PhoneReminderValues, int RYI_WebID)
     {

            var JsonReturned = object1();
            // access the Json object like this -> JsonReturned.message
            ....
           //rest of code

     }

    public IHttpActionResult object1()
     {
       return new Json(new {message ="hello world"});
     }

【问题讨论】:

  • 这看起来像是 Json.NET 的工作。
  • @DanielShillcock 如果对象使用 JSON.net 序列化然后 deserializeObject 工作,我可以访问消息属性,如上面的示例,但是如何访问 IHttpActionResult Json 对象?
  • 为什么不将逻辑从object1()移出到返回对象的私有方法中,让object1()调用该私有方法并返回结果?然后在PhoneReminder 中,您也可以调用相同的私有方法,这样您就没有无意义的 JSON 序列化和反序列化
  • @succeed 这是一个隐藏更深层次问题的XY problem。如果两个操作都属于同一个 ApiController,则可以将共享功能提取到它自己的功能/服务中并由两个操作使用。确实不需要在控制器中进行所有繁重的序列化和反序列化。查看当前的设计选择。
  • @p3tch 是的,这是一个解决方案,但是出于一致性目的和普遍兴趣,是否有办法访问返回的这个 Json 对象

标签: c# json json.net asp.net-web-api2


【解决方案1】:

从 NuGet 获取 Newtonsoft.Json。

然后你可以这样做:

public async Task<T> GetObjectFromContent<T>(HttpContent content) where T: class
{
    string response = await content.ReadAsStringAsync();
    if (string.IsNullOrWhiteSpace(response))
        return null;

    try
    {
        T obj = JsonConvert.DeserializeObject<T>(response);
        return obj;
    }
    catch(JsonSerializationException)
    {
        return null;
    }          
}

首先我从 HttpContent 得到一个字符串响应。它实际上只是一个字符串中的 json。 然后使用 JsonConvert.DeserializeObject。当然你必须先声明类。例如,如果你有这样的 Json:

{
    "FirstName" : "John",
    "SecondName" : "Black"
}

那么你必须创建类:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

并以 Person 为 T 调用此方法 (GetObjectFromContent)。 你的类应该有一个无参数的构造函数。 你也可以给你的属性起不同的名字,但是你必须用属性 JsonProperty 来装饰它们

【讨论】:

  • 我也可以返回一个 JsonConvert.SerializeObject();然后反序列化 JsonConvert.DeserializeObject();但是,我有兴趣专门访问传递给我的示例中返回的 Json 方法的匿名类型
【解决方案2】:
Use Nuget Newtonsoft.Json

如果假设你的 JSON 对象是这样的:

HttpResponseMessage response;
var jsonObject = await response.Content.ReadAsStringAsync();

现在假设您在 JSON 中有一个要访问的属性“FirstName”

你可以这样做:

using Newtonsoft.Json.Linq;

var parsedJsonObject = JObject.Parse(jsonObject);
var firstName =  parsedJsonObject["FirstName"]; 

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 2018-08-11
    • 2017-04-27
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多