Gson - попытка преобразовать строку json в пользовательский объект - PullRequest
1 голос
/ 18 февраля 2011

Вот мой Json вернулся с сервера

{"ErrorCode":1005,"Message":"Username does not exist"}

Вот мой класс за ошибку

public class ErrorModel {
public int ErrorCode;
public String Message;
}

и вот мой код конверсии.

public static ErrorModel GetError(String json) {

    Gson gson = new Gson();

    try
    {
        ErrorModel err = gson.fromJson(json, ErrorModel.class);

        return err;
    }
    catch(JsonSyntaxException ex)
    {
        return null;
    }
}

Это всегда вызывает исключение JsonSyntaxException. Есть идеи, что может быть моей проблемой здесь?

РЕДАКТИРОВАТЬ : По запросу, здесь дальнейшая разработка.

Мой бэкэнд - это приложение ASP.NET MVC 2, действующее как API отдыха. Здесь не проблема с бэкэндом, поскольку все мои действия (и даже ошибки сервера) возвращают Json (используя встроенный JsonResult). Вот образец.

[HttpPost]
public JsonResult Authenticate(AuthenticateRequest request)
{
    var authResult = mobileService.Authenticate(request.Username, request.Password, request.AdminPassword);

    switch (authResult.Result)
    {
         //logic omitted for clarity
         default:
            return ExceptionResult(ErrorCode.InvalidCredentials, "Invalid username/password");
            break;
    }

    var user = authResult.User;

    string token = SessionHelper.GenerateToken(user.UserId, user.Username);

    var result = new AuthenticateResult()
    {
        Token = token
    };

    return Json(result, JsonRequestBehavior.DenyGet);
}

Основная логика заключается в аутентификации учетных данных пользователя и возвращении ExceptionModel в виде json или AuthenticationResult в качестве json.

Вот моя исключительная модель на стороне сервера

public class ExceptionModel
{
    public int ErrorCode { get; set; }
    public string Message { get; set; }

    public ExceptionModel() : this(null)
    {

    }

    public ExceptionModel(Exception exception)
    {
        ErrorCode = 500;
        Message = "An unknown error ocurred";

        if (exception != null)
        {
            if (exception is HttpException)
                ErrorCode = ((HttpException)exception).ErrorCode;

            Message = exception.Message;
        }
    }

    public ExceptionModel(int errorCode, string message)
    {
        ErrorCode = errorCode;
        Message = message;
    }
}

Когда вышеуказанная аутентификация вызывается с неверными учетными данными, результат ошибки возвращается, как и ожидалось. Возвращенный Json - это Json выше в вопросе.

На стороне андроида я сначала строю объект с моими парами ключ-значение.

public static HashMap<String, String> GetAuthenticationModel(String username, String password, String adminPassword, String abbr)
{
    HashMap<String, String> request = new HashMap<String, String>();
    request.put("SiteAbbreviation", abbr);
    request.put("Username", username);
    request.put("Password", password);
    request.put("AdminPassword", adminPassword);

    return request;
}

Затем я отправляю сообщение http и возвращаю в виде строки все, что отправлено обратно.

public static String Post(ServiceAction action, Map<String, String> values) throws IOException {
    String serviceUrl = GetServiceUrl(action);

    URL url = new URL(serviceUrl);

    URLConnection connection = url.openConnection();
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    String data = GetPairsAsString(values);

    DataOutputStream output = new DataOutputStream(connection.getOutputStream());
    output.writeBytes(data);
    output.flush();
    output.close();

    DataInputStream input = new DataInputStream(connection.getInputStream());

    String line;
    String result = "";
    while (null != ((line = input.readLine())))
    {
        result += line;
    }
    input.close ();

    return result;
}

private static String GetServiceUrl(ServiceAction action)
{
    return "http://192.168.1.5:33333" + action.toString();
}

private static String GetPairsAsString(Map<String, String> values){

    String result = "";
    Iterator<Entry<String, String>> iter = values.entrySet().iterator();

    while(iter.hasNext()){
        Map.Entry<String, String> pairs = (Map.Entry<String, String>)iter.next();

        result += "&" + pairs.getKey() + "=" + pairs.getValue();
    }

    //remove the first &
    return result.substring(1);
}

Затем я беру этот результат и передаю его в свой синтаксический анализатор, чтобы увидеть, является ли это ошибкой

public static ErrorModel GetError(String json) {

    Gson gson = new Gson();

    try
    {
        ErrorModel err = gson.fromJson(json, ErrorModel.class);

        return err;
    }
    catch(JsonSyntaxException ex)
    {
        return null;
    }
}

Но JsonSyntaxException всегда генерируется.

1 Ответ

6 голосов
/ 18 февраля 2011

Может помочь узнать больше об исключении, но тот же пример кода отлично работает здесь.Я подозреваю, что есть кусок кода, который вы пропустили, который вызывает проблему (возможно, создание / извлечение строки JSON).Вот пример кода, который отлично работал для меня на Java 1.6 и Gson 1.6:

import com.google.gson.Gson;

public class ErrorModel {
  public int ErrorCode;
  public String Message;
  public static void main(String[] args) {
    String json = "{\"ErrorCode\":1005,\"Message\":\"Username does not exist\"}";
    Gson gson = new Gson();
    ErrorModel err = gson.fromJson(json, ErrorModel.class);
    System.out.println(err.ErrorCode);
    System.out.println(err.Message);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...