【问题标题】:C# JSON.NET How can I create generic telegram?C# JSON.NET 如何创建通用电报?
【发布时间】:2014-08-19 22:15:16
【问题描述】:

我正在构建一个 C# (.NET 4.5) 通用“电报”——因为没有更好的词——它使用 tcp 和 JSON,尤其是 JSON.NET 在 plc 和普通 pc 之间进行通信。我有一个 tcp 服务器设置和工作,我可以从对象中创建 Json 字符串,然后可以传递这些字符串。所以我只剩下定义一个标准的方式来来回传递信息、命令和事件。我现在苦苦挣扎的是如何轻松格式化“有效负载”。我有一个 JsonTelegram 类,其中包含一个名为“payload”的动态变量 - 或多或少是这样的:

private dynamic _payload;
public dynamic payload
{
    get
    {
        return _payload;
    }
    set
    {
        _payload = value;
        updateContents();
    }
}

所以如果我像这样更新这个变量:

myTelegram.payload = rampTime;

我希望看到最终的 JSON 是这样的:

{
    "purpose": "Update this variable",
    "payload": {
        "rampTime": 2000
    },
    "timeStamp": "2000-01-01T00:00:00.000-00:00",
    "returnID": "2000-01-01T00:00:00.000-00:00"
}

这是我真正苦苦挣扎的有效负载部分,因为那里的代码最终看起来像这样:

{
    "purpose": "Update this variable",
    "payload": 2000,
    "timeStamp": "2000-01-01T00:00:00.000-00:00",
    "returnID": "2000-01-01T00:00:00.000-00:00"
}

当 updateContents() 使用这个时:

 ... Newtonsoft.Json.JsonConvert.SerializeObject(_payload) ...

你看到“斜坡”这个词是如何被“有效载荷”取代的吗?我知道我可以创建一个方法并同时传递对象和对象的名称——这肯定会起作用。但我想变得更棘手,只是因为它应该是可能的,也因为在路上我可以看到其他一些原因,这种设计可能会更好地工作。我希望代码简单地知道调用它的变量的名称并使用它。我已经看到了很多使用我几乎不理解的东西的建议,但是当我尝试调整它时,它似乎被一个问题或另一个问题挂断了。所以我想我会问一个新问题,因为肯定有很多人想用 JSON 和新动态做同样的事情?

StackOverflow 包含关于属性和字典、反射、与 t 相关的信息、表达式等的信息。比如这个问题:How do you get a variable's name as it was physically typed in its declaration? 和这个Finding the variable name passed to a function

我不介意把类代码弄得乱七八糟,但我希望调用代码像“myTelegram.payload = rampTime;”一样干净

很抱歉,我不能很好地处理所有建议 - 我大部分时间都在编写 plc 代码,而现在有一个 plc 一边做 C#。

另外,如果有更优雅的方式来做完全不同的事情,我很想听听。

谢谢!

【问题讨论】:

  • 使用匿名类型。 myTelegram.payload = new { rampTime = rampTime };

标签: c# json.net


【解决方案1】:

听起来您正在寻找ExpandoObject。使用 ExpandoObject,您的电报看起来像:

class Telegram
    {
        private dynamic _payload = new ExpandoObject();
        public dynamic payload
        {
            get
            {
                return _payload;
            }
        }

        public string ToJson()
        {
            ...
        }
    }

在你的代码中:

var telegram = new Telegram();
telegram.payload.rampTime = 2000;
Console.WriteLine(telegram.ToJson());

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多