Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json.NET到GSON,可能是新手问题_Json_Json.net - Fatal编程技术网

Json.NET到GSON,可能是新手问题

Json.NET到GSON,可能是新手问题,json,json.net,Json,Json.net,我在.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_LOCAT

我在.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"
  ]
}
然后我去创建一个POJO,选择“Gson”作为注释样式,因为这似乎是要做的事情。我按Preview,得到一个不包含这些枚举值的类

@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;
}

}

看来我用错Json.NET了。然而,我的用法似乎很简单;我希望使用枚举字符串而不是int使最终的协议随着情况的变化而变得健壮,并且我希望使用类型指示,以便在Android端反序列化到正确的POJO,因为对于多类型查询/响应协议,我将使用几个不同的类。我这样做是否有明显的错误?

选择JSON模式而不是JSON作为您的源类型

结果:

@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
@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