gpt4 book ai didi

java - 如何在 Java 中读取没有名称的元素的 JSON 响应(SurveyGizmo 调查响应 API)

转载 作者:行者123 更新时间:2023-12-02 00:00:45 24 4
gpt4 key购买 nike

我正在使用 Surveygizmo API 来检索调查响应,但是在其 JSON 响应(下面的示例)中我遇到了两个问题。

  1. 我如何迭代问题:答案对,似乎没有与之关联的字段名称,所以我无法执行 JSONObject.getJSONObject("fieldname");或 JSONArray.getJSONArray("fieldname");由于调查的跳过逻辑,我不知道需要输入什么 QuestionId,因此我也无法通过“question(#)”获得。

  2. 我需要问题的 QuestionId,但是考虑到 key 是“[question(#)]”,我该如何获取 QuestionId,因为我不相信它是 JSONObject 或 JSONArray,我应该这样做吗?将其视为字符串并执行正则表达式搜索以检索“question()”中的 #?

JSON响应示例

{
"result_ok":true,
"total_count":"1",
"page":1,
"total_pages":1,
"results_per_page":50,
"data":[{
"id":"1",
"contact_id":"",
"status":"Complete",
"is_test_data":"1",
"datesubmitted":"2013-02-07 12:00:00",
"sResponseComment":"",
"[question(3)]":"15",
"[question(4), option(10003)]":"Baseball",
"[question(4), option(10007)]":"Basketball",
"[question(4), option(10009)]":"Hockey",
"[question(12)]":"No",
"[question(14)]":"Yes",
"[question(15)]":"Abc",
"[question(16)]":"No"
}]
}

最佳答案

我一直在从事类似的项目。这是我到目前为止所拥有的。

模型.cs:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace DeSerializer
{
[JsonObject]
public class Responses
{
public bool result_ok { get; set; }
public string total_count { get; set; }
public int page { get; set; }
public int total_pages { get; set; }
public int results_per_page { get; set; }
public SurveyResponse[] Data { get; set; }
}

[JsonObject]
// Here is the magic: When you see this type, use this class to read it.
// If you want, you can also define the JsonConverter by adding it to
// a JsonSerializer, and parsing with that.
[JsonConverter(typeof(DataItemConverter))]
public class SurveyResponse
{
public string id { get; set; }
public string contact_id { get; set; }
public string status { get; set; }
public string is_test_data { get; set; }
public DateTime datesubmitted { get; set; }
public string sResponseComment { get; set; }
public List<SurveyQuestion> SurveyQuestions { get; set; }
public List<SurveyUrl> SurveyUrls { get; set; }
public List<SurveyGeoData> SurveyGeoDatas { get; set; }
public List<SurveyVariable> SurveyVariables { get; set; }
public List<SurveyVariableShown> SurveyVariableShowns { get; set; }
public List<SurveyQuestionHidden> SurveyQuestionHiddens { get; set; }
public List<SurveyQuestionOption> SurveyQuestionOptions { get; set; }
public List<SurveyQuestionMulti> SurveyQuestionMulties { get; set; }
}

public class SurveyQuestion
{
[Key]
public int QuestionID { get; set; }
public string QuestionResponse { get; set; }
}

public class SurveyUrl
{
[Key]
public int SurveyUrlID { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}

public class SurveyGeoData
{
[Key]
public int SurveyGeoDataID { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}

public class SurveyVariable
{
[Key]
public int SurveyVariableID { get; set; }
public string Value { get; set; }
}

public class SurveyVariableShown
{
[Key]
public int SurveyVariableShownID { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}

public class SurveyQuestionHidden
{
[Key]
public int QuestionID { get; set; }
public string QuestionResponse { get; set; }
}

public class SurveyQuestionOption
{
[Key]
public int OptionID { get; set; }
public int QuestionID { get; set; }
public string QuestionResponse { get; set; }
}

public class SurveyQuestionMulti
{
[Key]
public int OptionID { get; set; }
public int QuestionID { get; set; }
public string QuestionResponse { get; set; }
}

public class DataItemConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(SurveyResponse);
}

public override bool CanRead
{
get { return true; }
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = (SurveyResponse)existingValue;
if (value == null)
{
value = new SurveyResponse();
value.SurveyQuestions = new List<SurveyQuestion>();
value.SurveyUrls = new List<SurveyUrl>();
value.SurveyGeoDatas = new List<SurveyGeoData>();
value.SurveyVariables = new List<SurveyVariable>();
value.SurveyVariableShowns = new List<SurveyVariableShown>();
value.SurveyQuestionHiddens = new List<SurveyQuestionHidden>();
value.SurveyQuestionOptions = new List<SurveyQuestionOption>();
value.SurveyQuestionMulties = new List<SurveyQuestionMulti>();
}

// Skip opening {
reader.Read();

while (reader.TokenType == JsonToken.PropertyName)
{
var name = reader.Value.ToString();
reader.Read();

// Here is where you do your magic
string input = name;

//[question(1)]
//[question(11)]
//[question(111)]
//[question(1234)]
//[question(12345)]
//[url(12345)]
//[variable(12345)]
//SINGLE ANSWER
Match matchSingleAnswer = Regex.Match(input, @"\[(question|calc|comment)\(([0-9]{5}|[0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1})\)]",
RegexOptions.IgnoreCase);


//SINGLE VARIABLE
Match matchSingleVariable = Regex.Match(input, @"\[(variable)\(([0-9]{5}|[0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1})\)]",
RegexOptions.IgnoreCase);

//URL
Match matchUrl = Regex.Match(input, @"\[url",
RegexOptions.IgnoreCase);

//GEO DATA
Match matchGeo = Regex.Match(input, @"\[variable\(""STANDARD_",
RegexOptions.IgnoreCase);

//VARIABLES SHOWN
Match matchVariables = Regex.Match(input, @"\[variable",
RegexOptions.IgnoreCase);

//[question(1), option(\"1
//[question(11), option(\"2
//[question(111), option(\"1
//[question(1234), option(\"1
//[question(12345), option(\"1
////////////////////////////////////////////
////////The \ values are being removed.
////////////////////////////////////////////
//OPTIONAL ANSWERS
string myReg = @"\[(question|url|variable|calc|comment)\(([0-9]{5}|[0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1})\),\ option\(""[0-9]";
Match matchOption = Regex.Match(input, myReg,
RegexOptions.IgnoreCase);

//[question(1), option(1
//[question(11), option(2
//[question(111), option(1
//[question(1234), option(1
//[question(12345), option(1
//MULTIPLE CHOICE
Match matchMultiSelect = Regex.Match(input, @"\[question\(([0-9]{5}|[0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1})\),\ option\([0-9]",
RegexOptions.IgnoreCase);



//[question(1), option(0)
//[question(11), option(0)
//[question(111), option(0)
//[question(1234), option(0)
//[question(12345), option(0)
//HIDDEN
Match matchHiddenValue = Regex.Match(input, @"\[question\(([0-9]{5}|[0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1})\),\ option\(0\)",
RegexOptions.IgnoreCase);


if (matchSingleAnswer.Success)
{
int index = int.Parse(name.Substring(10, name.IndexOf(')') - 10));
SurveyQuestion sq = new SurveyQuestion();
sq.QuestionID = index;
sq.QuestionResponse = serializer.Deserialize<string>(reader);
value.SurveyQuestions.Add(sq);
}
else if (matchUrl.Success)
{
string urlName = name.Substring(6, name.Length - 9);
SurveyUrl su = new SurveyUrl();
su.Name = urlName;
su.Value = serializer.Deserialize<string>(reader);
value.SurveyUrls.Add(su);
}
else if (matchGeo.Success)
{
string geoName = name.Substring(11, name.Length - 14);
SurveyGeoData sgd = new SurveyGeoData();
sgd.Name = geoName;
sgd.Value = serializer.Deserialize<string>(reader);
value.SurveyGeoDatas.Add(sgd);
}
else if (matchSingleVariable.Success)
{
int index = int.Parse(name.Substring(10, name.IndexOf(')') - 10));
SurveyVariable sv = new SurveyVariable();
sv.SurveyVariableID = index;
sv.Value = serializer.Deserialize<string>(reader);
value.SurveyVariables.Add(sv);
}
else if (matchVariables.Success)
{
string varName = name.Substring(11, name.Length - 14);
SurveyVariableShown svs = new SurveyVariableShown();
svs.Name = varName;
svs.Value = serializer.Deserialize<string>(reader);
value.SurveyVariableShowns.Add(svs);
}
else if (matchHiddenValue.Success)
{
int index = int.Parse(name.Substring(10, name.IndexOf(')') - 10));
SurveyQuestionHidden sqh = new SurveyQuestionHidden();
sqh.QuestionID = index;
sqh.QuestionResponse = serializer.Deserialize<string>(reader);
value.SurveyQuestionHiddens.Add(sqh);
}
else if (matchMultiSelect.Success)
{
//Multiple choice question selections
string[] nameArray = name.Split(')');
string questionPart = nameArray[0];
string optionPart = nameArray[1];
int index = int.Parse(questionPart.Substring(10, questionPart.Length - 10));
int indexSub = int.Parse(optionPart.Substring(9, optionPart.Length - 9));

SurveyQuestionMulti sqm = new SurveyQuestionMulti();
sqm.OptionID = indexSub;
sqm.QuestionID = index;
sqm.QuestionResponse = serializer.Deserialize<string>(reader);
value.SurveyQuestionMulties.Add(sqm);

//NEED TO ADD A BASE QUESTION TO POINT TO ALL THE MULTI
//SurveyQuestion sq = new SurveyQuestion();
//sq.QuestionID = sqm.QuestionID;
//sq.QuestionResponse = "";
//value.SurveyQuestions.Add(sq);
}
else if (matchOption.Success)
{
//Optional text value for a given question
string[] nameArray = name.Split(')');
string questionPart = nameArray[0];
string optionPart = nameArray[1];
int index = int.Parse(questionPart.Substring(10, questionPart.Length - 10));
int indexSub = int.Parse(optionPart.Substring(10, 5));

SurveyQuestionOption sqo = new SurveyQuestionOption();
sqo.OptionID = indexSub;
sqo.QuestionID = index;
sqo.QuestionResponse = serializer.Deserialize<string>(reader);
value.SurveyQuestionOptions.Add(sqo);
}
else
{
var property = typeof(SurveyResponse).GetProperty(name);
if (property != null)
property.SetValue(value, serializer.Deserialize(reader, property.PropertyType), null);
}

// Skip the , or } if we are at the end
reader.Read();
}

return value;
}

public override bool CanWrite
{
get { return false; }
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}

并且,program.cs 文件中的 Main 函数:

            string webReq = String.Empty;

//Office Energy - Allan Testing
webReq += "https://restapi.surveygizmo.com/head/survey/xxxxxx";
webReq += "/surveyresponse/";
webReq += "?user:pass=xxxxxxxx:xxxxxxx";
webReq += "&page=101&resultsperpage=1";

HttpWebRequest request = WebRequest.Create(webReq) as HttpWebRequest;
var results = String.Empty;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
results += reader.ReadToEnd();
}


Responses responses = new JavaScriptSerializer().Deserialize<Responses>(results);


Console.WriteLine("FEED HEADERS:");
Console.WriteLine("");
Console.WriteLine("result_ok: " + responses.result_ok);
Console.WriteLine("total_count: " + responses.total_count);
Console.WriteLine("page: " + responses.page);
Console.WriteLine("total_pages: " + responses.total_pages);
Console.WriteLine("results_per_page: " + responses.results_per_page);
Console.WriteLine("");
Console.WriteLine("");


foreach (var item in responses.Data)
{
Console.WriteLine("id: " + item.id);
Console.WriteLine("contact_id: " + item.contact_id);
Console.WriteLine("status: " + item.status);
Console.WriteLine("is_test_data: " + item.is_test_data);
Console.WriteLine("datesubmitted: " + item.datesubmitted);
Console.WriteLine("sResponseComment: " + item.sResponseComment);
Console.WriteLine("");
}

Console.WriteLine("Press enter to continue...");
Console.ReadLine();

//using live stream
var result = JsonConvert.DeserializeObject<Responses>(results);
//local results (not using live stream)
//var result = JsonConvert.DeserializeObject<Responses>(localResults);


//want to calcualte the highest kay number for the loop
//http://stackoverflow.com/questions/2805703/good-way-to-get-the-key-of-the-highest-value-of-a-dictionary-in-c-sharp
//var max = result.Data[0].questions[0].Aggregate((l, r) => l.Key > r.Key ? l : r).Key;


foreach (var item in result.Data[0].SurveyQuestions)
{
string label = "QuestionID = " + item.QuestionID;
string val = "QuestionResponse = " + item.QuestionResponse;
Console.WriteLine(label);
Console.WriteLine(val);
Console.WriteLine("");


//Question Option
var listOptions = result.Data[0].SurveyQuestionOptions;
var listLocalQuestionOptions = from o in listOptions
where o.QuestionID == item.QuestionID
select o;
foreach (var itemSub in listLocalQuestionOptions)
{
Console.WriteLine(" OPTIONAL");
string labelSub1 = " OptionID = " + itemSub.OptionID;
string labelSub2 = " QuestionID = " + itemSub.QuestionID;
string valSub1 = " QuestionResponse = " + itemSub.QuestionResponse;
Console.WriteLine(labelSub1);
Console.WriteLine(labelSub2);
Console.WriteLine(valSub1);
Console.WriteLine("");
}


//Question Multi
var listMulties = result.Data[0].SurveyQuestionMulties;
var listLocalQuestionMulties = from m in listMulties
where m.QuestionID == item.QuestionID
select m;
foreach (var itemSub in listLocalQuestionMulties)
{
Console.WriteLine("MULTIES");
string labelSub1 = " OptionID = " + itemSub.OptionID;
string labelSub2 = " QuestionID = " + itemSub.QuestionID;
string valSub1 = " QuestionResponse = " + itemSub.QuestionResponse;
Console.WriteLine(labelSub1);
Console.WriteLine(labelSub2);
Console.WriteLine(valSub1);
Console.WriteLine("");
}


}

//Console.WriteLine("");
//Console.WriteLine("");
//Console.WriteLine("");
//Console.WriteLine("");

//foreach (var item in result.Data[0].SurveyQuestionOptions)
//{
// string label = "OptionID = " + item.OptionID;
// string label2 = "QuestionID = " + item.QuestionID;
// string val = "QuestionResponse = " + item.QuestionResponse;
// Console.WriteLine(label);
// Console.WriteLine(label2);
// Console.WriteLine(val);
// Console.WriteLine("");
//}

//Console.WriteLine("");

Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("HIDDENS");
Console.WriteLine("");

foreach (var item in result.Data[0].SurveyQuestionHiddens)
{
string label = "QuestionID = " + item.QuestionID;
string val = "QuestionResponse = " + item.QuestionResponse;
Console.WriteLine(label);
Console.WriteLine(val);
Console.WriteLine("");
}



Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("MULTIES");
Console.WriteLine("");

foreach (var item in result.Data[0].SurveyQuestionMulties)
{
string label = "OptionID = " + item.OptionID;
string label2 = "QuestionID = " + item.QuestionID;
string val = "QuestionResponse = " + item.QuestionResponse;
Console.WriteLine(label);
Console.WriteLine(label2);
Console.WriteLine(val);
Console.WriteLine("");
}



Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("URL VALUES");
Console.WriteLine("");

foreach (var item in result.Data[0].SurveyUrls)
{
string label = "SurveyUrlID = " + item.SurveyUrlID;
string label2 = "Name = " + item.Name;
string val = "Value = " + item.Value;
Console.WriteLine(label);
Console.WriteLine(label2);
Console.WriteLine(val);
Console.WriteLine("");
}



Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("GEO VALUES");
Console.WriteLine("");

foreach (var item in result.Data[0].SurveyGeoDatas)
{
string label = "SurveyGeoDataID = " + item.SurveyGeoDataID;
string label2 = "Name = " + item.Name;
string val = "Value = " + item.Value;
Console.WriteLine(label);
Console.WriteLine(label2);
Console.WriteLine(val);
Console.WriteLine("");
}



Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("VARIABLES");
Console.WriteLine("");

foreach (var item in result.Data[0].SurveyVariables)
{
string label = "SurveyVariableID = " + item.SurveyVariableID;
string val = "Value = " + item.Value;
Console.WriteLine(label);
Console.WriteLine(val);
Console.WriteLine("");
}



Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("VARIABLES SHOWN");
Console.WriteLine("");

foreach (var item in result.Data[0].SurveyVariableShowns)
{
string label = "SurveyVariableShownID = " + item.SurveyVariableShownID;
string label2 = "Name = " + item.Name;
string val = "Value = " + item.Value;
Console.WriteLine(label);
Console.WriteLine(label2);
Console.WriteLine(val);
Console.WriteLine("");
}




Console.WriteLine("");
Console.WriteLine("Press enter to exit...");
Console.ReadLine();

关于java - 如何在 Java 中读取没有名称的元素的 JSON 响应(SurveyGizmo 调查响应 API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com