Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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
C# 通过javaandroid使用restfulcweb服务_C#_Java_Android_.net_Rest - Fatal编程技术网

C# 通过javaandroid使用restfulcweb服务

C# 通过javaandroid使用restfulcweb服务,c#,java,android,.net,rest,C#,Java,Android,.net,Rest,亲爱的 我知道这个标题似乎很受欢迎,也很简单,但我面对的太奇怪了 简单地说,我在服务器上发布了一个RESTful C.NET4.0Web服务,我想通过Android应用程序中的Java使用它,简单吗 问题是:每当我调用.NETWeb服务并得到响应时,java都无法将返回字符串解析为Json 错误消息: 调试: 我做了很多调试场景,但没有运气,这里我将使用最奇怪的一个来描述问题 我使用java代码使用GoogleWeb服务进行货币转换,使用以下链接http://www.google.com/ig/

亲爱的

我知道这个标题似乎很受欢迎,也很简单,但我面对的太奇怪了

简单地说,我在服务器上发布了一个RESTful C.NET4.0Web服务,我想通过Android应用程序中的Java使用它,简单吗

问题是:每当我调用.NETWeb服务并得到响应时,java都无法将返回字符串解析为Json

错误消息:

调试:

我做了很多调试场景,但没有运气,这里我将使用最奇怪的一个来描述问题

我使用java代码使用GoogleWeb服务进行货币转换,使用以下链接http://www.google.com/ig/calculator?hl=en&q=1USD=?EUR 我得到的答复如下:{lhs:1美元,rhs:0.726321906欧元,错误:,icc:true}。在这里,我的代码工作得很好

我从Google web服务复制了确切的Json值返回,并很好地处理了我的代码,然后在我的RESTful C服务中将其作为硬编码字符串返回,如下所示:

C代码:

我使用与调用Google web服务相同的代码请求我的C.NET web服务,但我在org.json.JSONException上面列出了错误:java.lang.String类型的Value{lhs:1 Euro,rhs:1.3711美元,error:,icc:true}无法在org.json.json.typemistchjson.java:111转换为JSONObject

当我将返回值作为硬代码复制并粘贴到我的代码中时,它可以正常工作

JSONObject obj = null;
try {
    obj = new JSONObject("{lhs:\"1 Euro\",rhs: \"1.3711 U.S. dollars\",error: \"\",icc: true}");
} catch (JSONException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
许多疯狂的调试场景都完成了,包括更改服务器本身,但运气不佳

我做错了什么


在JSON中,还需要将键用引号括起来。为此:

{lhs:1美元,rhs:0.726321906欧元,错误:,icc:true}

您必须这样做:

{lhs:1美元,rhs:0.726321906欧元,错误:,icc:true}


您可以在以下位置在线查看JSON:

经过长时间的调试过程,我找到了原因,然后找到了解决方案。我们开始:

通过Chrome浏览器访问,您将得到Json响应。为了进行调试,请在页面上单击鼠标右键,然后选择“查看页面源”。请注意,Json的字符串是纯Json,没有添加任何内容

当您通过Chrome浏览器对C.NET响应重复相同的过程时,您会注意到响应不是纯Json,它被以下内容包围:{Json String HERE}

解决方案:

要删除响应周围的这个字符串,必须将Json字符串作为System.IO.Stream返回。此处显示所需的代码更改:

public System.IO.Stream GetInfo()
{
    OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
    context.ContentType = "text/plain";
    return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes("{lhs:\"1 Euro\",rhs: \"1.3711 U.S. dollars\",error: \"\",icc: true}"));
}

这个解决方案对我来说很好,但它是最佳解决方案吗?从对象转换为Json,然后从Json字符串转换为字节的开销很小,您认为呢?建议?

如果它能与谷歌合作,那么你的代码似乎还可以,使用你自己的服务器,它就会失败。。。发生了什么变化?数据源,而不是您的代码。你检查过你的服务实际返回的内容了吗?它的格式和你期望的一样吗?提示:使用fiddler来计算它。你能在这里复制一下buffer.toString的样子吗?ThanksBuffer看起来像:24401:{lhs:\1欧元\,rhs:\1.3711美元\,错误:\\,icc:true}完全正确@lboshuizen,正如我告诉你的,我将字符串原样复制到了我的C函数中,当我通过任何浏览器Chrome、Firefox或IE使用它时,所有结果都是一样的。从浏览器上看,可以,但是android应用程序请求并返回了什么,以及如何返回?@lboshuizen,我在这行obj=new JSONObjectbuffer.toString之前打印缓冲区返回值;它看起来像是缓冲区看起来像:24401:{lhs:\1欧元\,rhs:\1.3711美元\,错误:\\,icc:true}你怎么看?嗨,我已经按照你的建议做了,当我特别调试时,我使用.NET JavaScript序列化程序如下:字符串json=new System.Web.Script.Serialization.JavaScriptSerializer.SerializationMyObject;它给出了上面同样的错误。另外,如果Google返回的字符串不是有效的Json,为什么Java代码会接受它?您使用的是MVC控制器还是Web API控制器?我想我使用的是Web API控制器:/您的控制器是否扩展了controller或ApicController,controller是MVC类,ApicController是用于WebAPI的。如果您的控制器是WebAPI控制器,则不要序列化该对象,只需返回它,剩下的工作由WebAPI完成。
public string GetInfo()
{
return "{lhs:\"1 Euro\",rhs: \"1.3711 U.S. dollars\",error: \"\",icc: true}";
}
JSONObject obj = null;
try {
    obj = new JSONObject("{lhs:\"1 Euro\",rhs: \"1.3711 U.S. dollars\",error: \"\",icc: true}");
} catch (JSONException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
public System.IO.Stream GetInfo()
{
    OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
    context.ContentType = "text/plain";
    return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes("{lhs:\"1 Euro\",rhs: \"1.3711 U.S. dollars\",error: \"\",icc: true}"));
}