【问题标题】:How to remove an element from json string before deserialize it?如何在反序列化之前从 json 字符串中删除元素?
【发布时间】:2021-10-18 09:31:50
【问题描述】:

假设返回类型是

    public ActionResult Balance()
    {
        var myDtos = new List<BalanceModelDto>();
        return Ok(new {data = myDtos});
    }

在我的 xunit 中,我断言返回类型。

        using (var client = new HttpClient())
        {                          
            var response = await client.GetAsync($"/Balance");
            var responseString = await response.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject<BalanceModelDto>(responseString);

            Assert.IsType<BalanceModelDto>(result);

            Assert.Equal(1, result.Balance);
        }

问题是responseString"{\"data\":[{"balance\":1}]}"。但我想要的只是"[{"balance\":1}]"

【问题讨论】:

  • "{[{"balance\":1}]}" 不是有效的 json
  • 你为什么要断言不正确的东西?也许只是断言您的 api 实际返回的正确类型?
  • 为什么您将myDtos 放入data 对象中?您在其他任何地方都需要data 吗?否则请看下面的答案:您可以直接使用myDtos
  • 我无法删除“数据”。它存在很长时间。旧代码
  • @JL0PD,抱歉,已更新为 "[{"balance\":1}]"

标签: c# json json.net


【解决方案1】:

反序列化为JObject:

var responseRaw = (JObject) JsonConvert.DeserializeObject(responseString);

然后将该json对象的“数据”属性转换为BalanceModelDto[]

var result = responseRaw["data"].ToObject<BalanceModelDto[]>();

【讨论】:

    【解决方案2】:

    要么:您应该查看result.data 而不仅仅是result。 或:来自 ActionMethod 的 return Ok(myDtos);

    【讨论】:

    • 他没有显示BalanceModelDto... 可能只有balance 属性,所以它不会反序列化。但你有一个有效的观点。
    • 你的意思是Assert.IsType&lt;BalanceModelDto&gt;(result.data);?我试过了,但语法错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多