我正在使用c#。我的原始文件的一部分是:
message CodeDependency {
string path = 1;
DependencyType type = 2;
enum DependencyType {
NONE = 0;
TAR = 1;
ZIP = 2;
TAR_GZ = 3;
DIRECTORY = 4;
}
}
而且我有一个json字符串:
{"codeDependency": {
"path": "/CAP_TEST/job_manager/modules/1c8185d5-2add-4bd4-a332-8b21a6819608/tmpr9z7xinh.tar.gz",
"type": "TAR_GZ"
}}
我已经尝试了三种反序列化的方法:
JsonConvert.DeserializeObject<CodeDependency>
CodeDependency.Parser.ParseFrom
ProtoBuf.Serializer.Deserialize<CodeDependency>
它们都不起作用。根据错误消息,似乎无法对'TAR_GZ'进行反序列化。
Error converting value "TAR_GZ" to type 'Microsoft.ABC.GRPC.Modules.Module+Types+CodeDependency+Types+DependencyType'. Path 'graph.nodes[4].module.codeDependency.type', line 273, position 21. ---> System.ArgumentException: Requested value 'TAR_GZ' was not found
如果我将'TAR_GZ'更改为'TAR',没关系。因此,问题可能与“ TAR_GZ”中的下划线有关吗?有什么办法可以用C#解决吗? (在python中可以。)感谢您的帮助!
我已经尝试过使用NewtonsoftJson和一个根对象为您解决的问题这是我的解决方案:
namespace RegexTests
{
static class StringExtension
{
public static T DeserializeJson<T>(this string toSerialize)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(toSerialize, new Newtonsoft.Json.JsonSerializerSettings()
{
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
});
}
}
class Root
{
public CodeDependency CodeDependency { get; set; }
}
class CodeDependency
{
public string Path { get; set; }
public DependencyType Type { get; set; }
}
enum DependencyType
{
NONE = 0,
TAR = 1,
ZIP = 2,
TAR_GZ = 3,
DIRECTORY = 4,
}
class Program
{
static void Main(string[] args)
{
string json = "{\"CodeDependency\": { \"Path\": \"/CAP_TEST/job_manager/modules/1c8185d5-2add-4bd4-a332-8b21a6819608/tmpr9z7xinh.tar.gz\", \"Type\": \"TAR_GZ\" } }";
var obj = json.DeserializeJson<Root>();
Console.WriteLine();
Console.ReadLine();
}
}
}