【问题标题】:Deserialize JSON with empty attribute name使用空属性名反序列化 JSON
【发布时间】:2021-10-15 11:50:13
【问题描述】:

如何将以下 JSON 字符串反序列化为 C# 对象

{"":["Waybill already exist"]}

在某些情况下,“”也可以包含一个值

喜欢

{"RecevierAddress1" : ["Receiver address 1 can not be blank]}

【问题讨论】:

  • 这能回答你的问题吗? How to Convert JSON object to Custom C# object?
  • 你不能有没有名字的属性,所以你不能把这个 JSON 反序列化成一个简单的 C# 对象。您可以将其反序列化为 Dictionary<string,whatever> 虽然
  • @Leo 问题是如何反序列化一个空名称的字符串
  • 你希望这个反序列化到什么?
  • 听起来您正在尝试验证后端的某些帖子,为什么不发送 json 响应:{ "error": "Waybill already exists" }{ "error": "receiver address 1 cannot be blank", "field": "ReceiverAddress1" }

标签: c# json json-deserialization


【解决方案1】:

而您所问的原则上是不可能的,因为对象属性必须具有名称,您可以做的是将其转换为可以具有零长度字符串命名属性的 .net JsonDocument。

我认为 RL 数据会导致您必须处理此问题,除此之外,这表明数据质量较差,但您应该能够使用此技术处理它,这里来自单元测试

    [Fact]
    public void SerializeSillyObjectJsonTest()
    {
        string serialized = "{\"\":[\"Waybill already exist\"]}";
        var jdoc = System.Text.Json.JsonDocument.Parse(serialized);
        Assert.NotNull(jdoc);

        var jsonElement = jdoc.RootElement.GetProperty("");
        Assert.Equal(1, jsonElement.GetArrayLength());
    }

因此,您还可以检查您的具有上述名称的属性是否存在并选择要查找的内容

jdoc.RootElement.TryGetProperty("RecevierAddress1", out var receiverAddressElement)

【讨论】:

  • 读取这个 json 的另一种方法是使用 JsonDocument.RootElement.EnumerateObject 方法来获取每个属性的名称和值
【解决方案2】:

您可以使用JsonProperty("") 将属性名称设置为空字符串

class root
{
    [JsonProperty("")]
    public string[] x;  
}
JsonConvert.DeserializeObject<root>(@"{"""":[""Waybill already exist""]}")

对于动态名称,您可以有两个属性,也可以反序列化为字典

JsonConvert.DeserializeObject<Dictionary<string, string[]>>(@"{"""":[""Waybill already exist""]}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多