替换函数-无重载方法错误C#-尝试删除字符串中的节

替换函数-无重载方法错误C#-尝试删除字符串中的节,c#,arrays,loops,foreach,C#,Arrays,Loops,Foreach,我正在尝试从JSON创建URL 从JSON接收的“输入”数据以-sm开头,我试图将其替换为nothing“”(基本上删除它) 当使用Replace函数时,会出现一个无重载方法错误。如何避免这种情况,或者如何正确地构建此代码以避免出现错误?我想从所有输入数据中删除sm 到目前为止,我的代码是: List<string> url = new List<string>(); //Loop which adds Input and signatu

我正在尝试从JSON创建URL

从JSON接收的“输入”数据以-sm开头,我试图将其替换为nothing“”(基本上删除它)

当使用Replace函数时,会出现一个无重载方法错误。如何避免这种情况,或者如何正确地构建此代码以避免出现错误?我想从所有输入数据中删除sm

到目前为止,我的代码是:

        List<string> url = new List<string>();

        //Loop which adds Input and signature to array
        foreach (JObject item in jArray)
        {

            url.Add("https://" + (string)item.SelectToken("Input").Replace("sm-", "") + ".com/?sig=" + (string)item.SelectToken("signature"));
        }
List url=newlist();
//向数组中添加输入和签名的循环
foreach(jArray中的JObject项)
{
url.Add(“https://”+(字符串)项。SelectToken(“输入”)。替换(“sm-”,“)+”。com/?sig=“+(字符串)项。SelectToken(“签名”);
}
确切消息:CS1501方法“Replace”的无重载接受两个参数(字符串)项。选择令牌(“输入”)。Replace(“sm-”,“”)

需要

((字符串)项。选择令牌(“输入”)。替换(“sm-”,“”)

您还可以将代码拆分为单独的语句,以便于查找问题和调试

var url=newlist();
var json=“[{\'Input\':\'sm-a\',\'signature\':\'sig1\',{\'Input\':\'sm-b\',\'signature\':'sig2\'”;
var jArray=jArray.Parse(json);
foreach(jArray中的JObject项)
{
//缺少错误处理
var inputToken=(字符串)项。选择标记(“输入”);
var input=inputToken.Replace(“sm-”,“”);
var签名=(字符串)项。选择标记(“签名”);
url.Add(“https://“+input+”.com/?sig=“+signature”);
}
//网址
//"https://a.com/?sig=sig1"
//"https://b.com/?sig=sig2"
  • .SelectToken
    方法返回
    JToken
    值,而不是
    字符串
  • JToken
    类型支持隐式转换为
    String
    值,这就是为什么您能够像使用字符串一样使用返回的
    JToken
    值。
    • 更正:
      JToken
      类型仅支持从字符串进行隐式转换。在您的例子中,代码实际上是通过
      +(字符串,对象)
      操作符隐式调用
      JToken.ToString()
  • 但是,依赖隐式调用
    JToken.ToString()
    不是一个好主意,因此请先检查
    JToken.Type
    ,您可以将其全部简化为一个Linq表达式:
List url=jArray
.Select(item=>(输入:item.SelectToken(“输入”),sig:item.SelectToken(“签名”))
.Where(t=>t.input.Type==JTokenType.String&&t.sig.Type==JTokenType.String)
.Select(t=>(输入:(JValue)t.input,sig:(JValue)t.sig))/`JTokenType.String`表示`jtoken是JValue`
.Select(t=>(输入:t.input.ToString(),sig:t.sig.ToString())
.Select(t=>“https://”t.input+”.com/?sig=“+t.sig)
.ToList();

停止使用方法链,调试程序的每一步,以了解发生了什么。你所说的“框URL”是什么意思?显然,
SelectToken
不返回
字符串
值-或者它返回一个非
字符串
值,支持隐式转换为
字符串
。请阅读并发布一篇文章。同时发布准确的错误消息。这是编译时错误还是运行时错误?我已将确切的消息添加到threadCasting JToken字符串Is official:。还有,为什么这不是一个好主意?这是一个json文本。所有标记都是字符串。它们可以变成其他东西,但它们在本质上都是字符串。@tymtam啊,我忘记了显式转换(尽管这与
ToString()
,否?)。无论如何从
JToken
String
进行无条件转换的问题在于,如果
JToken
是一个JSON对象,则返回的字符串不应被视为字符串值,因为它将包含呈现的JSON,不应调用该JSON,因为这可能会使JSON无效(例如,如果密钥名称中有任何匹配项)。
List<string> urls = jArray
    .Select( item => ( input: item.SelectToken( "Input" ), sig: item.SelectToken( "signature" ) ) )
    .Where( t => t.input.Type == JTokenType.String && t.sig.Type == JTokenType.String  )
    .Select( t => ( input: (JValue)t.input, sig: (JValue)t.sig ) )  // `JTokenType.String` implies `jtoken is JValue`
    .Select( t => ( input: t.input.ToString(), sig: t.sig.ToString() ) )
    .Select( t => "https://" t.input + ".com/?sig=" + t.sig )
    .ToList();