我有一个json对象需要发布到网关.如下所示.

{
  "client_id": "test",
  "non_personalized_ads": false,
  "events": [
    {
      "name": "test",
      "params": {
        "items": [
          {
            "iteitem1":"iteiteitem1value",
            "Item1Number":1
          }
        ],
        "stringparm1":"stringValue1",
        "intparm1":1
      }
    }
  ]
}

我试图在我的C#项目中创建一个对象类.问题在于,这两个PARM的名称都是可配置的.所以这些都不是静态属性名.

  • "iteitem1":"iteiteitem1value",
  • "Item1Number":1
  • "stringparm1":"stringValue1",
  • "intparm1":1

因此,为了实现这一目标,我使用了一本字典<字符串,对象>因为值可以是一个数字或字符串,所以我使用了一个对象.

public class EventParameter
{
    public Dictionary<string, object> Parameters { get; set; }
    public Dictionary<string, object> Items { get; set; }
    public EventParameter()
    {
        Parameters = new Dictionary<string, object>();
        Items = new Dictionary<string, object>();
    }

    public void AddEventParameter(string name, object value)
    {
        Parameters.Add(name, value);
    }
}

不幸的是,当我做一个json PAR的时候,我得到了.这是不正确的,因为我的参数应该在parms下,而不是在它们自己的对象下.

{
  "client_id": "test",
  "non_personalized_ads": false,
  "events": [
    {
      "name": "hit_event",
      "params": {
        "Parameters": {
          "TestString": "test",
          "testInt": 1
        },
        "Items": {
          "test": 1,
          "test2": 1,
          "test3": "test"
        }
      }
    }
  ]
}

那么,如何将参数上移到parms?感觉parms需要成为一本字典&lt;字符串,对象&gt;但这样一来,它就会错过它的项目 list

 "Parameters": {
          "TestString": "test",
          "testInt": 1
        },

我想我的模型设计中少了一些东西.我已经研究这个问题太久了,我想不出解决办法.我的另一个 idea 是,这可以通过添加自定义json消毒器来实现吗?

如果您想要我的完整模型设计或我正在使用的单元测试,请告诉我.

unit test

[Fact]
public void Test1()
{

    var postData = new Event() { Name = "EventName" };
    postData.EventParameters.AddEventParameter("TestString", "test");
    postData.EventParameters.AddEventParameter("testInt", 1);
    postData.EventParameters.Items = new Dictionary<string, object>()
    {
        { "test", 1 },
        { "test2", 1 },
        { "test3", "test" },
    };
    
    var data = new EventData()
    {
        ClientId = "test",
        Events = new []
        {
            postData
        }
    };
    
    var options = new JsonSerializerOptions { IgnoreNullValues = true };
    var hold =JsonSerializer.Serialize(data);

    // add breakpoint here
    int i = 1;

}

推荐答案

下面是一个序列化到您展示的第一个json的类:

class X 
{
    public string client_id {get; set;}
    public bool non_personalized_ads {get; set;}

    public List<EventParameter> events { get;set;}
}

class EventParameter {
    public string name {get; set;}

    
    public Dictionary<string, object> @params {get; set;}
}

测试代码:

var x = new X 
{
    client_id = "test",
    non_personalized_ads = false,
    events = new List<EventParameter>{
        new EventParameter
        {
            name = "test1",
            @params = new Dictionary<string, object>{
                { "items", new Dictionary<string, object> {
                        {"itemitem1", "itemitem1value"},
                        {"itemitem1number", 1}
                    }},
                { "stringparm1", "stringValue1"},
                {"intparm1", 1}
            }
        }
    }
};

var json = System.Text.Json.JsonSerializer.Serialize(x, options: new System.Text.Json.JsonSerializerOptions{WriteIndented = true});
Console.WriteLine(json);

Json相关问答推荐

将嵌套的json中的字符串强制转换为数字

过go 24小时内判断员事件的EventBridge事件模式

Terraform迭代JSON文件以获取键值对

如何在Vega中使标记的符号在鼠标指针悬停时可点击

将PNG图像保存为Python中的JSON文件

使用Kotlin限制序列化类属性的允许整数值

使用JQ合并JSON列表中的对象

Spark-SQL中的from_unixtime函数未能给出正确的输出

使用不同行数的数据创建嵌套Jolt

Jolt 不打印任何东西

如何使用 SQL Server 将 json 存储为字符串的列分解/规范化为行和列?

Golang 解组行为:字段过多?

如何使用 ConfigurationBuilder 解析现有的 json 字符串(不是文件)

如何使用法语口音对数组进行 json_encode?

在 Django 1.9 中,使用 JSONField(本机 postgres jsonb)的约定是什么?

我们可以使用 JSON 作为数据库吗?

PostgreSQL 中的 JSON 模式验证?

JSON 和 BSON 哪个更轻量级?

无法将 System.String 转换或转换为 Class 对象

将 JSON 数据从 php 传递给 html-data 属性,然后传递给 Javascript