【问题标题】:create c# class for json string which have number as variables in object为 json 字符串创建 c# 类,其中有数字作为对象中的变量
【发布时间】:2020-09-30 06:53:34
【问题描述】:

我必须将以下 JSON 格式传递给 REST api

 "weconnect_validate":{
                "Row":[
                    {"0":"44063fe6-fe22-11ea-bb30-005056923098::TEST10800::9888880470","1":"TEST10800"}
                    ]
            }

现在这里发生的问题是我如何创建类

变量名称为 0 和 1 的行。

我已尝试关注

public class BasicRow
{
    [JsonProperty("0")]
    public string Zero { get; set; }
    [JsonProperty("1")]
    public string One { get; set; }
}
public class Weconnect_Validate
{
    
    public BasicRow[] rows { get; set; }
}

但它不起作用。在调试模式下它正在通过

Row:[{"Zero":......

请提出一些技巧或不同的方法来创建 c# 类。

编辑

以下 json 对象我需要使用 http 客户端发送到 REST api。

{"PWSESSIONRS":{"PWPROCESSRS":{"PWDATA":{"weconnect_validate":{"Row":[{"0":"dc9a2d38-fe28-11ea-bb30-005056923098","1":"TEST10800"}]}},"PWHEADER":{"LOGIN_ID":"TEST10800","ORG_ID":"HSA","APP_ID":"HSA","IN_PROCESS_ID":"1","OUT_PROCESS_ID":"weconnect_validate"}}}}

我的问题是如何为这种类型的 json 字符串或对象构建 c# 类。

【问题讨论】:

  • 你是用Newtonsoft.Json反序列化的吗?
  • 也许你可以使用 List>.
  • 您应该走在正确的轨道上。请提供一个完整的例子来说明什么不起作用。 stackoverflow.com/help/minimal-reproducible-example
  • @TsahiAsher 我没有反序列化它。我必须使用 httpclient 发送到 REST api,所以我使用 Javascript 序列化程序进行序列化。
  • @DavidStania 我刚刚在这里写了一个复杂的 json 对象的一部分。使用您的想法会导致复杂性。

标签: c# json rest variables webapi


【解决方案1】:

QuickType.io 提出了这个建议,鉴于您断言 JsonProperty 不起作用,我首先想到的是 (Array of Dictionary):

namespace SomeNamespaceHere
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class RootClassNameHere
    {
        [JsonProperty("weconnect_validate")]
        public WeconnectValidate WeconnectValidate { get; set; }
    }

    public partial class WeconnectValidate
    {
        [JsonProperty("Row")]
        public Dictionary<string, string>[] Row { get; set; }
    }

    public partial class RootClassNameHere
    {
        public static RootClassNameHere FromJson(string json) => JsonConvert.DeserializeObject<RootClassNameHere>(json, SomeNamespaceHere.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this RootClassNameHere self) => JsonConvert.SerializeObject(self, SomeNamespaceHere.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}

但是使用您提出的路线我实际上并没有遇到任何问题:

使用此代码:

    public class Row
    {
        [JsonProperty("0")]
        public string Zero { get; set; }
        [JsonProperty("1")]
        public string One { get; set; } 
    }

    
    public class WeconnectValidate
    {
        public List<Row> Row { get; set; }
    }

    public class Root
    {
        [JsonProperty("weconnect_validate")]
        public WeconnectValidate WeconnectValidate { get; set; }
    }

像这样使用:

        var x = JsonConvert.SerializeObject(new Root()
        {
            WeconnectValidate = new WeconnectValidate()
            {
                Row = new List<Row>(){
                    new Row() { Zero = "a", One = "b" },
                    new Row() { Zero = "c", One = "d" }
                    }
            }
        });

使用最新的 Newtonsoft.Json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2017-12-17
    相关资源
    最近更新 更多