我在.NET中有一个应用程序,我希望能够与Android应用程序通信。一些研究建议不使用XML,这是我通常的选择,而是使用我从未接触过的JSON。我使用的是Json.NET和GSON。
我在.NET中有一个简单的类;
public enum eCommandType
{
UNKNOWN,
PING,
GET_TIMINGS,
GET_EVENT_ID,
NEW_EVENT,
LOAD_PEOPLE,
LOAD_TAGS,
SET_LOCATION
}
public class CommandBase
{
[JsonConverter(typeof(StringEnumConverter))]
public eCommandType CommandType { get; set; }
}
我使用
生成架构 //Encode enums as strings, not integers.
JSchemaGenerator stringEnumGenerator = new JSchemaGenerator();
stringEnumGenerator.GenerationProviders.Add
(new StringEnumGenerationProvider());
JSchema schema = stringEnumGenerator.Generate(typeof(CommandBase));
string s = schema.ToString();
该架构是
{
"type": "object",
"properties": {
"CommandType": {
"type": "string",
"enum": [
"UNKNOWN",
"PING",
"GET_TIMINGS",
"GET_EVENT_ID",
"NEW_EVENT",
"LOAD_PEOPLE",
"LOAD_TAGS",
"SET_LOCATION"
]
}
},
"required": [
"CommandType"
]
}
然后我转到jsonschema2pojo并创建一个POJO,选择" Gson"作为注释风格,因为它似乎是要做的事情。我按下预览并获得一个不包含这些枚举值的类;
@Generated("org.jsonschema2pojo")
public class CommandType {
@Expose
private String type;
@SerializedName("enum")
@Expose
private List<String> _enum = new ArrayList<String>();
/**
*
* @return
* The type
*/
public String getType() {
return type;
}
/**
*
* @param type
* The type
*/
public void setType(String type) {
this.type = type;
}
/**
*
* @return
* The _enum
*/
public List<String> getEnum() {
return _enum;
}
/**
*
* @param _enum
* The enum
*/
public void setEnum(List<String> _enum) {
this._enum = _enum;
}
}
不出所料,如果我继续尝试在Android应用程序中使用此功能进行反序列化,我会得到一个只有字段默认值的对象。由于现阶段存在明显的问题,我没有包含Android方面的详细信息。
除了缺少的枚举值之外,POJO中没有名为&#34; CommandType的属性。&#34;该类本身已采用该名称,原始名称在模式生成中丢失。
如果我针对jsonschemavalidator尝试生成的架构,我会收到错误
Found 1 error(s)
Message: Required properties are missing from object: CommandType.
Schema path: #/required
所以我似乎错误地使用了Json.NET。但是我的用法看起来很简单;我想要枚举字符串而不是int来使最终协议变得健壮随着事情的变化,我想要一个类型指示,这样我就可以在Android端反序列化到正确的POJO,因为我将有几个不同的类用于多类型查询/响应协议。我试图这样做有什么明显的错误吗?
答案 0 :(得分:1)
选择JSON Schema而不是JSON作为http://www.jsonschema2pojo.org/
的源类型结果:
@Generated("org.jsonschema2pojo")
public static enum CommandType {
UNKNOWN("UNKNOWN"),
PING("PING"),
GET_TIMINGS("GET_TIMINGS"),
GET_EVENT_ID("GET_EVENT_ID"),
NEW_EVENT("NEW_EVENT"),
LOAD_PEOPLE("LOAD_PEOPLE"),
LOAD_TAGS("LOAD_TAGS"),
SET_LOCATION("SET_LOCATION");
private final String value;
...etc