我不是最好的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; }
}
答案 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));
}
}