JObject选择令牌空引用异常c#

时间:2016-03-16 00:49:09

标签: c# json asmx

伙计们,我正在努力完成这项工作,我有一个从android访问的asmx webservice,当我将json字符串发送到webservice时,我调用的SelectToken方法让第一个节点抛出一个NRE,但是当我使用json字符串手动调试VS中的代码时,不会发生此问题。只有从外面打电话才会发生。

[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public List<ProductDetail> getAllProductsNearMeJson(String ProductRequest)
{
    JObject obj = new JObject();
    String products = null;

    obj = JObject.Parse(ProductRequest);    

    JToken jtk = null;
    jtk = obj.SelectToken("ProductRequest",false);

    products = jtk.ToString();
    var request = JsonConvert.DeserializeObject<ProductMobileRequest>(products);

     //TESTE ONLY
    //var request = new ProductMobileRequest();
    //request.PRODUCT_LAT = "-30.1135";
    //request.PRODUCT_LNG = "-51.2441";
    //TESTE ONLY

    var lat = request.PRODUCT_LAT;
    var lng = request.PRODUCT_LNG;
    List<ProductDetail> pdrList = null;
    ProductMobileResponse response = new ProductMobileResponse();
    try
    {
        response = _productService.ListMobileNearLocation(request, lat, lng);
        if (response.PRODUCTS.Count > 0)
            response.STATUS = true;
        else
            response.STATUS = false;
    }
    catch (Exception ex)
    {
        response.STATUS = false;
        //response.EXCEPTION_MESSAGE = ex.Message;
    }

    if (response.STATUS)
    {
                       return response.PRODUCTS;
    }
    else
    {
        return pdrList;
    }
}

1 个答案:

答案 0 :(得分:0)

我通过修改我的方法的签名来修复我的问题,而不是在JObject中选择令牌,因此不需要在JObject中选择令牌,但是如果要通过HTTP传递Json,则需要修改复杂类型。 C#就是这样:

public class myclass
{
    [JsonProperty("name")]
    public string Name {get;set;]
}

[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public List<ProductDetail> getAllProductsNearMeJson(MyClass ProductRequest)
{
  //do your stuff here and return a List<T>
}

这样.net会在调用方法时将您的json字符串解析为有效的MyClass类型。