字典和对象的模型创建问题



我有一个json对象,需要发布到网关。它看起来如下。

{
"client_id": "test",
"non_personalized_ads": false,
"events": [
{
"name": "test",
"params": {
"items": [
{
"itemitem1": "itemitem1value",
"itemitem1number": 1
}
],
"stringparm1": "stringValue1",
"intparm1": 1
}
}
]
}

我正试图在我的C#项目中将其创建为一个对象类。问题是这两个parm的名称都是可配置的。所以这些都不是静态属性名。

  • "项目1":"itemitem1value">
  • "itemitem1number":1
  • "字符串臂1":"字符串值1">
  • "intparm1":1

因此,为了实现这一目标,我选择了Dictionary<字符串,对象>因为这个值可以是一个数字,也可以是我在Object中使用的字符串。

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解析时,我得到了。这是不正确的,因为我的参数应该在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需要成为一个Dictionary<字符串,对象>但随后它将丢失其项目列表

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

我猜想我的模型设计中少了些什么。我考虑这个问题太久了,我想不出解决办法。我的另一个想法是,可以通过添加自定义json消毒器来实现吗?

如果你想要我的完整模型设计或我用来测试的单元测试,请告诉我。

单元测试

[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);

最新更新