我有一个使用字符串作为键和值的映射.我有一个键数组,指定映射值的顺序.
我想将该映射序列化为JSON,但保持在数组上定义的顺序.
这里有一个示例代码:http://play.golang.org/p/A52GTDY6Wx
我想将它序列化为:
{
"name": "John",
"age": "20"
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我直接序列化地图,则按字母顺序排列键:
{
"age": "20",
"name": "John"
}
Run Code Online (Sandbox Code Playgroud)
我可以将它序列化为一个映射数组,从而保持顺序,但是会产生许多不需要的字符:
[
{
"name": "John"
},
{
"age": "20"
}
]
Run Code Online (Sandbox Code Playgroud)
在我的实际代码中,我需要序列化在文本文件中指定的数据库查询的结果,并且我需要维护列顺序.我不能使用结构,因为在编译时不知道列.
编辑:我不需要按照指定的顺序读取JSON.生成的JSON应该由人们阅读,所以我只是希望它尽可能具有人类可读性.
我可以使用自定义格式,但JSON非常适合我.
谢谢!
我正在使用.Net 4.5.1创建一个使用MVC 6的ASP.Net 5应用程序.我有一个POST方法,它使用FromBody参数自动获取对象.
[HttpPost]
public IActionResult Insert([FromBody]Agent agent)
{
try
{
var id = service.Insert(agent);
return Ok(id);
}
catch (Exception ex)
{
return HttpBadRequest(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一个概念的证明,我不会只返回成功的id或错误的完整异常.
当发送有效的JSON时,一切正常.但是,当发送无效的JSON时,我在调试期间收到异常:
抛出异常:Newtonsoft.Json.dll中的'Newtonsoft.Json.JsonReaderException'
附加信息:解析值后,遇到意外字符:l.路径'名称',第2行,第20位.
问题是在此错误之后,该方法被正常调用,但是使用null参数,并且异常不会传播.
我可以检查null并返回一个通用消息,但这并不像原始消息那样有用,它包含重要信息,例如标记名称和无效字符的位置.
所以我想捕获此异常并将其返回给HTTP调用者.我怎么做?像这样的东西:
{"error": "After parsing a value an unexpected character was encountered: l. Path 'Name', line 2, position 20"}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在try/catch块中手动捕获和反序列化JSON,但这对我来说是不可接受的.我想这样做并继续使用FromBody,我发现它很有效率.
当它们具有相同名称的属性时,是否可以将子对象或多个对象作为查询参数传递给 Dapper?
例如,如果我有这些类:
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public City City { get; set; }
}
class City
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想执行这个查询:
connect.QueryFirst<Result>("select :Id Id, :Name Name, :City_Id City_Id, :City_Name City_Name from dual", personParams);
Run Code Online (Sandbox Code Playgroud)
我在没有反射的情况下设法做到的唯一方法是传递第一个对象,然后一个接一个地添加其他属性:
var personParams = new DynamicParameters(person);
personParams.AddDynamicParams(new { City_Id = person.City.Id, City_name = person.City.Name });
Run Code Online (Sandbox Code Playgroud)
但是在数据库上有数百个表,其中一些有一百多个列,我需要将它们拆分为多个类。因此,一个接一个地传递参数是徒劳的。
我尝试将参数添加到一个临时包中,然后为每个包添加一个前缀,如下所示:
static DynamicParameters GetParameters(object mainEntity, …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的课程:
class PeopleByTag extends React.Component<RouteComponentProps<{ tag: string }>
Run Code Online (Sandbox Code Playgroud)
我需要在我的构造函数中做一些事情,在这个例子中获取数据,但要做到这一点,我需要声明一个 props 参数,但如果我不指定类型,它将变成任何类型:
constructor(props) {
super(props); // props is any
this.loadData();
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我重新声明类型,代码会变得非常难看:
constructor(props: Readonly<{
children?: React.ReactNode;
}> & Readonly<RouteComponentProps<{
tag: string;
}, StaticContext, any>>) {
super(props);
this.loadData();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法从类扩展中自动推断 props 类型,同时还可以编写构造函数?
我也不想使用已弃用的生命周期挂钩(即 ComponentWillMount)。
我正在尝试在Flutter中创建一个简单的小部件测试。我有一个自定义窗口小部件,该窗口小部件接收一些值,组成一个字符串并显示带有该字符串的文本。我必须创建窗口小部件并且它可以工作,但是在读取Text组件的值来断言所生成的文本正确时遇到了麻烦。
我创建了一个简单的测试来说明问题。我想获取文本值,即“文本”。我尝试了几种方法,如果我得到查找程序asString(),我可以解释字符串以获取值,但是我认为这不是一个好的解决方案。我想以文本形式读取组件,以便可以访问所有属性。
那么,我将如何阅读Text小部件,以便访问data属性?
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('my first widget test', (WidgetTester tester) async {
await tester
.pumpWidget(MaterialApp(home: Text("text", key: Key('unit_text'))));
// This works and prints: (Text-[<'unit_text'>]("text"))
var finder = find.byKey(Key("unit_text"));
print(finder.evaluate().first);
// This also works and prints: (Text-[<'unit_text'>]("text"))
var finderByType = find.byType(Text);
print(finderByType.evaluate().first);
// This returns empty
print(finder.first.evaluate().whereType<Text>());
// This throws: type 'StatelessElement' is not a subtype of type 'Text' in type cast
print(finder.first.evaluate().cast<Text>().first);
});
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Firebase 使我的 Flutter 应用离线工作。我在 Firestore 上存储了对我的图像的引用,在 Storage 上存储了图像文件。我让 Firestore 部分正常工作,并且我使用 CachedNetworkImageProvider 来显示我的图像,该图像缓存以供离线使用。但是当我离线时,即使图像被缓存,我也无法获取图像的URL,因此无法将其传递给以URL为键的CachedNetworkImageProvider。
因此,离线时我知道图像路径,并且我将文件存储在设备上,我只需要一种获取 URL 的方法。
我是否需要手动将存储中的下载 URL 存储在设备上,以便我可以离线使用它们?或者,还有更好的方法?
获取网址的代码:
// this doesn't work offline
category.url = await storage
.ref()
.child("category_images/drawable-${DeviceInfo.dpiString}")
.child(document.data["media"]["src"])
.getDownloadURL();
Run Code Online (Sandbox Code Playgroud)
显示图像的代码:
image: new CachedNetworkImageProvider(_category.url),
Run Code Online (Sandbox Code Playgroud) 我使用的是 Entity Framework Core,生成的类有自己的属性,即
数据模型.Agent.cs
public partial class Agent {
public virtual decimal Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
但我需要其他属性,所以我在另一个文件中声明它们:
代理.cs
public partial class Agent
{
[NotMapped]
public dynamic Custom { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是Agent.cs是在DataModel.Agent.cs之前编译的,所以编译器按照这个顺序生成属性:Custom、Id、Name,结果JSON很奇怪。
我希望它是:ID、名称、自定义。换句话说,我总是希望 DataModel 类排在第一位。
编辑:澄清一下,唯一的目标是通过始终将 Id 放在首位来使 JSON 更漂亮,这是一种非常常见的模式。这对应用程序的工作方式绝对没有影响。
有没有办法强制编译器始终首先编译其中一个文件?