无法隐式转换类型'字符串'到' int'

时间:2016-12-20 15:02:57

标签: c# json xamarin json.net

我不是最好的C#,因为我现在还在学习!但是,我无法从资产文件中分配已解析的JSON值。

解析工作正常,我可以找到一个路径。但是,该值是作为对象检索的,我无法将其转换为整数,这是当前的JSON值。

如何以正确的格式检索JSON值?要么是字符串要么是int。

我已经尝试了Convert.ToInt32(reader.Value)(int) reader.Value,如下所示。

但我收到错误Cannot implicitly convert type 'string' to 'int'

另外,我已尝试JsonConvert.DeserializeObject<T>(reader.Value)

这给出了两个错误:

  • The type or namespace name 'T' could not be found
  • Argument 1: cannot convert from 'object to 'string'

注意: CustomerVolumes()只是完整JSON响应的getter / setter映射类。一些值是字符串或整数。没什么特别的!

使用: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonReader.htm
使用:http://json2csharp.com创建 CustomerVolumes

public class DashboardActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Dashboard);

        string  jsonResponse      = ReadFile();
        var     CustomerVolumes   = new CustomerVolumes();

        JsonTextReader reader = new JsonTextReader(new StringReader(@jsonResponse));

        while (reader.Read())
        {
            if (reader.Value != null)
            {
                if (reader.Path.Equals("customers.id.cycles.yyyy_mm.scopes.mms.volume") && !reader.Value.Equals("volume"))
                {
                    CustomerVolumes.customers.id.cycles.yyyy_mm.scopes.mms.volume = Convert.ToInt32(reader.Value);
                }

                if (reader.Path.Equals("customers.id.cycles.yyyy_mm.scopes.gprs.volume") && !reader.Value.Equals("volume"))
                {
                    CustomerVolumes.customers.id.cycles.yyyy_mm.scopes.gprs.volume = (int) reader.Value;
                }
        }
    }

    private string ReadFile()
    {
        StreamReader sr = new StreamReader(Android.App.Application.Context.Assets.Open(JSON_FILE));
        string text     = sr.ReadToEnd();
                          sr.Close();

        return text;
    }
}

public class Mms
{
    public int volume { get; set; }
}

public class Gprs
{
    public int volume { get; set; }
}

public class Voice
{
    public int volume { get; set; }
}

public class Sms
{
    public int volume { get; set; }
}

public class Scopes
{
    public Mms mms { get; set; }
    public Gprs gprs { get; set; }
    public Voice voice { get; set; }
    public Sms sms { get; set; }
}

public class YyyyMm
{
    public Scopes scopes { get; set; }
}

public class Cycles
{
    public YyyyMm yyyy_mm { get; set; }
}

public class Id
{
    public Cycles cycles { get; set; }
}

public class Customers
{
    public Id id { get; set; }
}

public class CustomerVolumes
{
    public Customers customers { get; set; }
}

2 个答案:

答案 0 :(得分:1)

不熟悉你想要做的事,但只是猜测值得尝试。 On this website它显示JsonReader.Value属性返回Object而不是字符串。也许尝试显式地执行reader.value.tostring()并将其转换为整数。如果类型正确,我看不出你的代码无法正常工作的原因。

至于JsonConvert.DeserializeObject<T>(reader.Value),请确保您正在为字符串交换T:

JsonConvert.DeserializeObject<String>(reader.Value)
祝你好运!

编辑:

不熟悉你想要做的事,但只是猜测值得尝试。 On this website它显示JsonReader.Value属性返回Object而不是字符串。也许尝试显式地执行reader.value.tostring()并将其转换为整数。如果类型正确,我看不出你的代码无法正常工作的原因。

至于JsonConvert.DeserializeObject<T>(reader.Value),请确保您正在为字符串交换T:

JsonConvert.DeserializeObject<String>(reader.Value)
祝你好运!

编辑:

while (reader.Read())
{
    if (reader.Value != null)
    {
        string rVal = (string)reader.Value
        if (reader.Path.Equals("customers.id.cycles.yyyy_mm.scopes.mms.volume") && !(rVal.toUpper() == "VOLUME"))
        {
            CustomerVolumes.customers.id.cycles.yyyy_mm.scopes.mms.volume = Convert.ToInt32(rVal);
        }
}

尝试时会发生什么?

答案 1 :(得分:1)

在你的案例中没有必要使用JsonReader,因为你有一个名为CustomerVolumes的完整JsonResponse的生成对象

要在您的方法中使用它,只需使用:

var customerVolumes = JsonConvert.DeserializeObject<CustomerVolumes>( jsonResponse );

这将为您提供CustomerVolumes的新实例,并正确填写所有值。

无需解析整个对象和正确的路径。

作为一个例子,你可以查看这个.netfiddle,它接受​​一个json对象并在C#类中转换它。

由于我没有您正在使用的任何数据,这是一个小例子程序,以显示它如何工作

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Linq;

public class Program
{
    static string fakeJsonString = 
        @"{ ""text"": ""This is a text"", ""intValue"": 10, ""dictionary"": { ""key"": ""value"" }, ""array"": [ 10, 20, 30 ] }";


    internal class FakeObject {
        [JsonProperty("text")]
        public string Text { get;set; }
        [JsonProperty("intValue")]
        public int IntValue { get;set; }
        [JsonProperty("dictionary")]
        public Dictionary<string, string> Dictionary { get;set; }
        [JsonProperty("array")]
        public int[] IntArray { get;set; }
    }

    public static void Main()
    {
        var fakeObject = JsonConvert.DeserializeObject<FakeObject>( fakeJsonString );
        Console.WriteLine("Current value for text: "  + fakeObject.Text);
        Console.WriteLine("Current value for intValue: "  + fakeObject.IntValue);
        Console.WriteLine("Current value for Dictionary: "  + string.Join( ",", fakeObject.Dictionary.Select(kvp => "\"" + kvp.Key + "\": \"" + kvp.Value + "\"" ) ) );
        Console.WriteLine("Current value for IntArray: "  + string.Join( ",", fakeObject.IntArray));
    }
}