2015-09-13 3 views
0

Я боролся с моим первым проектом C#. Это контроллер веб-api, который получит сообщение от AngularJS. Сообщение появляется, но, похоже, имеет дополнительный набор скобок в объекте JSON (значение щелчка правой кнопкой мыши/копирование в vs 2015). Я пробовал различные методы, но каждый раз, когда я десериализую объект JSON, я получаю нулевые значения.MVC WEB API Controller C# JSON Deserialize не работает

public class LocationsTestController : ApiController 
{ 

    [System.Web.Http.HttpPost] 
    [Route("")] 

    public IHttpActionResult Post(object json) 
    { 

     string sjson = json.ToString(); 

     Coords oCoords = JsonConvert.DeserializeObject<Coords>(sjson); 

     DBEntities db = new DBEntities(); 
     db.spUpdateLocation(User.Identity.Name, oCoords.latitude.ToString(), oCoords.longitude.ToString()); 
     db.SaveChanges(); 

     return Ok(oCoords.latitude); //return trash data for now 
    } 

} 

Вот мой JSON, скопированный с объекта, полученного почтой.

{{ 
    "coords": { 
    "latitude": 43.445969749565833, 
    "longitude": -80.484091512936885, 
    "altitude": 100, 
    "accuracy": 150, 
    "altitudeAccuracy": 80, 
    "heading": 38, 
    "speed": 25 
    }, 
    "timestamp": 1442113213418 
}} 

Я попытался отображение в рамках сущности, но проблема в том, что мне нужно добавить авторизованное имя пользователя на объект JSON, как я не хочу верить, что передается в API.

Любая помощь будет высоко оценена.

ответ

1

Попробуйте получить модель вместо простой строки в методе WebAPI:

public class CoordsItemModel 
{ 
    public double latitude { get; set; } 
    public double longitude { get; set; } 
    public int altitude { get; set; } 
    public int accuracy { get; set; } 
    public int altitudeAccuracy { get; set; } 
    public int heading { get; set; } 
    public int speed { get; set; } 
} 

public class CoordsModel 
{ 
    public CoordsItemModel coords { get; set; } 
    public long timestamp { get; set; } 
} 

[System.Web.Http.HttpPost] 
[Route("")] 
public IHttpActionResult Post(CoordsModel model) 
{ 
    DBEntities db = new DBEntities(); 
    db.spUpdateLocation(User.Identity.Name, model.coords.latitude.ToString(), model.coords.longitude.ToString()); 
    db.SaveChanges(); 

    return Ok(model.coords.latitude.ToString()); //return trash data for now 
} 
+0

Это сработало.Вот модель, которую я использовал: public class Rootobject { public Coords coords {get; задавать; } public long timestamp {get; задавать; } } общественный класс Coords { public float latitude {get; задавать; } public float longitude {get; задавать; } public int heightitude {get; задавать; } public int precision {get; задавать; } public int altitudeAccuracy {get; задавать; } public int heading {get; задавать; } public int speed {get; задавать; } } – Kevin

0
Use It. 
public class coordsSample 
     { 
      public string latitude { get; set; } 
      public string longitude { get; set; } 
      public int altitude { get; set; } 
      public int accuracy { get; set; } 
      public int altitudeAccuracy { get; set; } 
      public int heading { get; set; } 

      public int speed { get; set; } 
     } 

     public class coords1 
     { 
      public coordsSample coords { get; set; } 
      public long timestamp { get; set; } 
     } 

    static void Main(string[] args) 
     { 
      var jsonFormat = @"[{""timestamp"":""1442113213418"",""coords"":{ 
""latitude"":""43.445969749565833"",""longitude"":""-80.484091512936885"",""altitude"":""100"",""accuracy"":""150"" 
,""altitudeAccuracy"":""80"",""heading"":""38"",""speed"":""25""}}]"; 
      var result = JsonConvert.DeserializeObject<coords1>(jsonFormat.Substring(1).Substring(0, jsonFormat.Length - 2)); 

      Console.WriteLine(result.coords.latitude); 
      Console.WriteLine(result.coords.longitude); 
} 

Попробуйте Как что это поможет для you.because этих координат вы принимаете в JSON это trated как свойства, так для этого вам нужно создать новый класс и назначить эти свойства в внутри it.thanks

0

Возможно, возникли некоторые проблемы с тем, как вы отправляете сообщения с клиентской стороны. Трудно проверить без кода клиента и что именно происходит в сети (например, в скрипаче).

Как правило, веб-api должен иметь возможность получить объект напрямую без десериализации его. Таким образом, если клиент размещает правильную JSON, это должно работать

public IHttpActionResult Post(Coords oCoords) 
{ 
    //use oCoords directly 
} 

Если это не сработает, попробуйте изменить метод Web API получить строку, а не объект, и десериализацию этой строки.

public IHttpActionResult Post(string jsonString) 
{ 
    Coords oCoords = JsonConvert.DeserializeObject<Coords>(jsonString); 

    //rest of the code 
} 

Если у вас есть двойные фигурные скобки, вы можете сделать это, прежде чем десериализации

jsonString = jsonString.Replace("{{", "{").Replace("}}", "}"); 

Но, очевидно, это не правильное исправление. Проблема все еще остается.

+0

Я попробовал все 3 из этих вариантов и в варианте 1, и 3 я до сих пор получить нулевые значения. Вариант 2 является самым загадочным для меня, потому что, если я изменю сообщение, чтобы получить строку, я получаю следующий ответ: { сообщение: «Запрошенный ресурс не поддерживает метод http« POST ». } – Kevin

Смежные вопросы