【问题标题】:.Net Deserialize JSON into c# object [duplicate].Net将JSON反序列化为c#对象[重复]
【发布时间】:2017-11-20 11:03:10
【问题描述】:

我正在努力将 json 转换为 c# 对象。

我的 json 是由另一个应用程序(在 typescript 中)生成的,这是用于生成我的 json 的对象的结构:

有了这个结构,我可以创建像这样的 json:

{
    EQNode: { key: "userid", value: 5}
}

或更复杂:

{
    AndNode: [
        {
            EQNode: { key: "userid", value: 5 }
        },
        {
            LikeNode: { key: "username", value: "foo" }
        }
    ]
}

甚至更复杂:

{
    AndNode: [
        {
            EQNode: { key: "userid", value: 5 }
        },
        {
            OrNode: [
                {
                    LikeNode: { key: "username", value: "foo" }
                },
                {
                    LikeNode: { key: "email", value: "foo@bar.fr" }
                },
            ]
        }
    ]
}

我已经设法使用这个模型解析我的 json :

public class EQNode
{
    [JsonProperty("key")]
    public string key { get; set; }

    [JsonProperty("value")]
    public int value { get; set; }
}

public class LikeNode
{
    [JsonProperty("key")]
    public string key { get; set; }

    [JsonProperty("value")]
    public string value { get; set; }
}

public class GTNode
{
    [JsonProperty("key")]
    public string key { get; set; }

    [JsonProperty("value")]
    public int value { get; set; }
}

public class LTNode
{
    [JsonProperty("key")]
    public string key { get; set; }

    [JsonProperty("value")]
    public int value { get; set; }
}

public class OrNode
{
    [JsonProperty("EQNode")]
    public EQNode EQ { get; set; }
}

public class AndNode
{
    [JsonProperty("EQNode")]
    public EQNode EQ { get; set; }

    [JsonProperty("LikeNode")]
    public LikeNode LIKE { get; set; }

    [JsonProperty("GTNode")]
    public GTNode GT { get; set; }

    [JsonProperty("LTNode")]
    public LTNode LT { get; set; }

    [JsonProperty("OrNode")]
    public List<OrNode> OR { get; set; }

    [JsonProperty("AndNode")]
    public List<OrNode> And { get; set; }
}

public class RootObject
{
    [JsonProperty("AndNode")]
    public List<AndNode> And { get; set; }

    [JsonProperty("OrNode")]
    public List<OrNode> OR { get; set; }

    [JsonProperty("EQNode")]
    public EQNode EQ { get; set; }

    [JsonProperty("LikeNode")]
    public LikeNode LIKE { get; set; }

    [JsonProperty("GTNode")]
    public GTNode GT { get; set; }

    [JsonProperty("LTNode")]
    public LTNode LT { get; set; }
}

但这对我来说似乎有点“硬编码”。有没有办法为我的模型提供一个更好/更好的模型结构?

【问题讨论】:

  • 我不清楚为什么你有四个不同的节点类,它们都具有相同的结构。那不能只是UnaryNode吗? (我还强烈建议您开始为您的属性遵循 .NET 命名约定。)
  • 查看我的答案并借助 Visual Studio ..无需详细了解 json 的结构,Visual Studio 为您工作
  • 请注意,只要属性括号中的 JSON 名称与您一样,您可以随意命名 C# 类和属性。
  • 在 JSON 中,名称用 "" 括起来,即 { "key": "123" },而不是 { key: "123" }
  • 您好,感谢您的回答,实际上我原帖中的所有示例都是出于演示目的,不是我的实际代码或 json,我会更新我的帖子

标签: c# .net json deserialization


【解决方案1】:

如果你有 Json,那么你可以使用 Visual Studio 本身生成 C# 类。

在 Visual Studio 中找到“Paste Sepcial”菜单。即复制您的 json 字符串并单击 Paste special ,它将为您生成 C# 类。

你可以关注我的帖子:Generate Class From JSON or XML in Visual Studio

【讨论】:

  • TY 我从来不知道这个我一直用 [link]json2csharp.com
  • 我怎么不知道这个!? :D
  • @IainGalloway - 通过参加视觉工作室的在线培训
  • 感谢您的回答。我不知道该功能,我对其进行了测试,但它与我的代码相同(没有 JsonProperty 装饰器和不同的函数名称)我将更新我的帖子以获取更多信息。
  • 为避免混淆,我从这里开始,抱歉重复发帖:stackoverflow.com/questions/47394775/…
【解决方案2】:

如果您决定一个特定的 JSON 模式并在您的两个应用程序中使用它,那会更好。更详细的 JSON 将帮助我为您提供更好的见解。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2017-01-28
  • 2011-12-23
  • 1970-01-01
  • 2012-03-07
  • 2015-08-05
相关资源
最近更新 更多