繁体   English   中英

如何将 MessagePack-CSharp 与字符串 JSON 一起使用? 不是 CLI,是 neuecc/MessagePack-CSharp

[英]How to use MessagePack-CSharp with string JSON? Not is CLI, is neuecc/MessagePack-CSharp

using MessagePack;
[MessagePackObject]
public class CPegar_ids
{
    [Key(0)]
    public string operationName { get; set; }
    [Key(1)]
    public Variables variables { get; set; }
    [Key(2)]
    public string query { get; set; }
}

[MessagePackObject]
public class Variables
{
    [Key(0)]
    public object activeType { get; set; }
    [Key(1)]
    public string[] instruments { get; set; }
    [Key(2)]
    public string leverageInstrument { get; set; }
    [Key(3)]
    public int userGroupID { get; set; }
    [Key(4)]
    public string sortField { get; set; }
    [Key(5)]
    public string sortDirection { get; set; }
    [Key(6)]
    public int limit { get; set; }
    [Key(7)]
    public int offset { get; set; }
}
string json_data = @"
{
  ""operationName"": ""GetAssets"",
  ""variables"": {
    ""activeType"": null,
    ""instruments"": [
      ""BinaryOption"",
      ""DigitalOption"",
      ""FxOption"",
      ""TurboOption""
    ],
    ""leverageInstrument"": ""BinaryOption"",
    ""userGroupID"": 193,
    ""sortField"": ""Name"",
    ""sortDirection"": ""Ascending"",
    ""limit"": 20,
    ""offset"": 0
  },
  ""query"": """"
}
";

var ob_ids = MessagePackSerializer.Deserialize<CPegar_ids>(Encoding.UTF8.GetBytes(json_data ));

Console.WriteLine($" IDS OB: {ob_ids.GetType()}");

https://github.com/neuecc/MessagePack-CSharp

我正在使用 HttpWebRequest 下载 JSON,它返回一个 var 字符串。 我想使用此字符串与 MessagePackSerializer 进行反序列化。 我尝试了几种不同的方法,使用 Utf8Json 我可以做到,但是使用这个 MessagePack 我不能。 我想使用 MessagePack 因为它快得多。

看起来 MessageBack 有自己的不是 JSON 的符号。 但是您正试图将 Json 反序列化为他们的自定义符号,但由于显而易见的原因而失败。 他们似乎通过使用更多的 unicode 代替 JSON 等标准字符来保持紧凑。

https://msgpack.org/index.html

这就是为什么您不会通过放入 JSON 字符串并尝试对其进行反序列化来使其工作的原因。 如果您正在寻找更快的 JSON 选项,还有一些其他常见的 Newtonsoft Json.NET 替代方案,例如 fastJSON https://github.com/mgholam/fastJSON

反转您的示例代码,我们可以获得序列化值的示例:

var myObject = new CPegar_ids {
    operationName = "GetAssets",
    variables = new Variables {
        activeType = null,
        instruments = new string[] {
            "BinaryOption",
            "DigitalOption",
            "TurboOption"
        },
        leverageInstrument = "BinaryOption",
        userGroupID = 193,
        sortField = "Name",
        sortDirection = "Ascending",
        limit = 20,
        offset = 0
    },
    query = ""
};

var bytes = MessagePackSerializer.Serialize(myObject);
Console.WriteLine(Encoding.UTF8.GetString(bytes));

其输出为: operationName GetAssets variables activeType instruments BinaryOption DigitalOption TurboOption leverageInstrument BinaryOption userGroupID sortField Name sortDirection Ascending limit14 offset00 query

我找不到一个很好的解释为什么它不起作用。 但是有一种方法可以使它工作,而不是使用Key(int index)属性,我们将使用Key(string propertyName)属性。

您应该使用索引 (int) 键还是字符串键? 我们建议使用索引键来实现更快的序列化和比字符串键更紧凑的二进制表示。 参考。

对象

[MessagePackObject]
public class CPegar_ids
{
    [Key("operationName")]
    public string operationName { get; set; }
    [Key("variables")]
    public Variables variables { get; set; }
    [Key("query")]
    public string query { get; set; }
}

[MessagePackObject]
public class Variables
{
    [Key("activeType")]
    public object activeType { get; set; }
    [Key("instruments")]
    public string[] instruments { get; set; }
    [Key("leverageInstrument")]
    public string leverageInstrument { get; set; }
    [Key("userGroupID")]
    public int userGroupID { get; set; }
    [Key("sortField")]
    public string sortField { get; set; }
    [Key("sortDirection")]
    public string sortDirection { get; set; }
    [Key("limit")]
    public int limit { get; set; }
    [Key("offset")]
    public int offset { get; set; }
}

序列化

var jsonByteArray = MessagePackSerializer.ConvertFromJson(File.ReadAllText("json1.json"));
CPegar_ids  ob_ids = MessagePackSerializer.Deserialize<CPegar_ids>(jsonByteArray);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM