我不是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/help/html/t_newtonsoft_json_jsonreader.htm
和也使用:http://json2csharp.com创建 custicervolumes class> class
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; }
}
在您的情况下无需使用jsonreader,因为您为完整的JSONRESPONSE的生成对象称为CustomerVolumes
要在您的方法中使用它,只需使用:
var customerVolumes = JsonConvert.DeserializeObject<CustomerVolumes>( jsonResponse );
这将为您提供CustomerVolumes
的新实例,所有值正确填充。
无需解析完整的对象和正确的路径。
作为一个例子,您可以查看此.netfiddle,该.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));
}
}
不熟悉您要做的事情,而只是值得尝试的猜测。在此网站上,它显示了jsonreader.value属性返回对象而不是字符串。也许尝试明确地做读者。如果类型正确,我看不出您的代码为什么不起作用。
至于JsonConvert.DeserializeObject<T>(reader.Value)
,请确保您将t交换为:
JsonConvert.DeserializeObject<String>(reader.Value)
祝你好运!
编辑:
不熟悉您要做的事情,而只是值得尝试的猜测。在此网站上,它显示了jsonreader.value属性返回对象而不是字符串。也许尝试明确地做读者。如果类型正确,我看不出您的代码为什么不起作用。
至于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);
}
}
尝试一下?